--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Transport.py b2188ce9a746a35b770b10bea1b7ccbe93b4e198 (b2188ce9) Text, 226.59 KB
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787os
Tff7b72import T7ee787gc
Tff7b72import T7ee787RNS
Tff7b72import T7ee787time
Tff7b72import T7ee787math
Tff7b72import T7ee787struct
Tff7b72import T7ee787inspect
Tff7b72import T7ee787threading
Tff7b72from T7ee787time Tff7b72import Te6edf3sleep
Tff7b72from T7ee787threading Tff7b72import Te6edf3Lock
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72from T7ee787.T7ee787vendor Tff7b72import Te6edf3umsgpack Tff7b72as Te6edf3umsgpack
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787BackboneInterface Tff7b72import Te6edf3BackboneInterface
Tff7b72class T56d364TransportTb4b4b4:
T8b949e"""
Through static methods of this class you can interact with the
Transport system of Reticulum.
"""
T8b949e# Constants
Te6edf3BROADCAST Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3TRANSPORT Tff7b72= T79c0ff0x01Tb4b4b4;
Te6edf3RELAY Tff7b72= T79c0ff0x02Tb4b4b4;
Te6edf3TUNNEL Tff7b72= T79c0ff0x03Tb4b4b4;
Te6edf3types Tff7b72= Tb4b4b4[Te6edf3BROADCASTTb4b4b4, Te6edf3TRANSPORTTb4b4b4, Te6edf3RELAYTb4b4b4, Te6edf3TUNNELTb4b4b4]
Te6edf3REACHABILITY_UNREACHABLE Tff7b72= T79c0ff0x00
Te6edf3REACHABILITY_DIRECT Tff7b72= T79c0ff0x01
Te6edf3REACHABILITY_TRANSPORT Tff7b72= T79c0ff0x02
Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffrnstransportTa5d6ff"
Te6edf3PATHFINDER_M Tff7b72= T79c0ff128 T8b949e# Max hops
T8b949e"""
Maximum amount of hops that Reticulum will transport a packet.
"""
Te6edf3PATHFINDER_R Tff7b72= T79c0ff1 T8b949e# Retransmit retries
Te6edf3PATHFINDER_G Tff7b72= T79c0ff5 T8b949e# Retry grace period
Te6edf3PATHFINDER_RW Tff7b72= T79c0ff0.5 T8b949e# Random window for announce rebroadcast
Te6edf3PATHFINDER_E Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff24Tff7b72*T79c0ff7 T8b949e# Path expiration of one week
Te6edf3AP_PATH_TIME Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff24 T8b949e# Path expiration of one day for Access Point paths
Te6edf3ROAMING_PATH_TIME Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff6 T8b949e# Path expiration of 6 hours for Roaming paths
T8b949e# TODO: Calculate an optimal number for this in
T8b949e# various situations
Te6edf3LOCAL_REBROADCASTS_MAX Tff7b72= T79c0ff2 T8b949e# How many local rebroadcasts of an announce is allowed
Te6edf3PATH_REQUEST_TIMEOUT Tff7b72= T79c0ff15 T8b949e# Default timeout for client path requests in seconds
Te6edf3PATH_REQUEST_GATE_TIMEOUT Tff7b72= T79c0ff120 T8b949e# Default timeout for client path request gate control in seconds
Te6edf3PATH_REQUEST_GRACE Tff7b72= T79c0ff0.4 T8b949e# Grace time before a path announcement is made, allows directly reachable peers to respond first
Te6edf3PATH_REQUEST_RG Tff7b72= T79c0ff1.5 T8b949e# Extra grace time for roaming-mode interfaces to allow more suitable peers to respond first
Te6edf3PATH_REQUEST_MI Tff7b72= T79c0ff20 T8b949e# Minimum interval in seconds for automated path requests
Te6edf3STATE_UNKNOWN Tff7b72= T79c0ff0x00
Te6edf3STATE_UNRESPONSIVE Tff7b72= T79c0ff0x01
Te6edf3STATE_RESPONSIVE Tff7b72= T79c0ff0x02
Te6edf3LINK_TIMEOUT Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffSTALE_TIME Tff7b72* T79c0ff1.25
Te6edf3ALLOW_LINK_PATH_REBALANCE Tff7b72= Tff7b72True
Te6edf3REVERSE_TIMEOUT Tff7b72= T79c0ff8Tff7b72*T79c0ff60 T8b949e# Reverse table entries are removed after 8 minutes
Te6edf3DESTINATION_TIMEOUT Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff24Tff7b72*T79c0ff7 T8b949e# Destination table entries are removed if unused for one week
Te6edf3UNUSED_DESTINATION_LINGER Tff7b72= T79c0ff6Tff7b72*T79c0ff60 T8b949e# Linger time for pathless and never used destinations
Te6edf3TUNNEL_TIMEOUT Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff8 T8b949e# Tunnel table entries are removed if unused for eight hours
Te6edf3TUNNEL_PATH_TIMEOUT Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff8 T8b949e# Tunnel path table entries are removed if unused for eight hours
Te6edf3MAX_RECEIPTS Tff7b72= T79c0ff1024 T8b949e# Maximum number of receipts to keep track of
Te6edf3MAX_RATE_TIMESTAMPS Tff7b72= T79c0ff16 T8b949e# Maximum number of announce timestamps to keep per destination
Te6edf3PERSIST_RANDOM_BLOBS Tff7b72= T79c0ff32 T8b949e# Maximum number of random blobs per destination to persist to disk
Te6edf3MAX_RANDOM_BLOBS Tff7b72= T79c0ff64 T8b949e# Maximum number of random blobs per destination to keep in memory
Te6edf3READY_WAIT Tff7b72= T79c0ff60 T8b949e# Maximum wait time for inbound packets received before transport core was ready
Te6edf3interfaces Tff7b72= Tb4b4b4[Tb4b4b4] T8b949e# All active interfaces
Te6edf3destinations Tff7b72= Tb4b4b4[Tb4b4b4] T8b949e# All active destinations
Te6edf3destinations_map Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# Destination hash map of active destinations
Te6edf3pending_links Tff7b72= Tb4b4b4[Tb4b4b4] T8b949e# Links that are being established
Te6edf3active_links Tff7b72= Tb4b4b4[Tb4b4b4] T8b949e# Links that are active
Te6edf3packet_hashlist Tff7b72= Tffa657setTb4b4b4(Tb4b4b4) T8b949e# A list of packet hashes for duplicate detection
Te6edf3packet_hashlist_prev Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Te6edf3receipts Tff7b72= Tb4b4b4[Tb4b4b4] T8b949e# Receipts of all outgoing packets for proof processing
T8b949e# Notes on memory usage: 1 megabyte of memory can store approximately
T8b949e# 55.100 path table entries or approximately 22.300 link table entries.
Te6edf3announce_table Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A table for storing announces currently waiting to be retransmitted
Te6edf3path_table Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A lookup table containing the next hop to a given destination
Te6edf3reverse_table Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A lookup table for storing packet hashes used to return proofs and replies
Te6edf3link_table Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A lookup table containing hops for links
Te6edf3held_announces Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A table containing temporarily held announce-table entries
Te6edf3announce_handlers Tff7b72= Tb4b4b4[Tb4b4b4] T8b949e# A table storing externally registered announce handlers
Te6edf3tunnels Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A table storing tunnels to other transport instances
Te6edf3announce_rate_table Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A table for keeping track of announce rates
Te6edf3path_requests Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A table for storing path request timestamps
Te6edf3path_states Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A table for keeping track of path states
Te6edf3blackholed_identities Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A table for keeping track of blackholed identities
Te6edf3discovery_path_requests Tff7b72= Tb4b4b4{Tb4b4b4} T8b949e# A table for keeping track of path requests on behalf of other nodes
Te6edf3discovery_pr_tags Tff7b72= Tb4b4b4[Tb4b4b4] T8b949e# A table for keeping track of tagged path requests
Te6edf3max_pr_tags Tff7b72= T79c0ff32000 T8b949e# Maximum amount of unique path request tags to remember
Te6edf3max_queued_discovery_prs Tff7b72= T79c0ff32 T8b949e# Maximum amount of queued discovery path requests
Te6edf3interfaces_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3destinations_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3destinations_map_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3inbound_announce_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3announce_table_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3announce_rate_table_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3announce_handler_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3path_table_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3reverse_table_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3link_table_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3active_links_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3pending_links_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3tunnels_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3receipts_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3discovery_pr_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3discovery_pr_tags_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3path_requests_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3pending_local_prs_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3path_states_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3jobs_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3cache_clean_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3persist_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
T8b949e# Transport control destinations are used
T8b949e# for control purposes like path requests
Te6edf3control_destinations Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3control_hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3mgmt_destinations Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3mgmt_hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3remote_management_allowed Tff7b72= Tb4b4b4[Tb4b4b4]
T8b949e# Interfaces for communicating with
T8b949e# local clients connected to a shared
T8b949e# Reticulum instance
Te6edf3local_client_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3local_client_rssi_cache Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3local_client_snr_cache Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3local_client_q_cache Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3local_hops_delta Tff7b72= T79c0ff0
Te6edf3LOCAL_CLIENT_CACHE_MAXSIZE Tff7b72= T79c0ff512
Te6edf3pending_local_path_requests Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3ready Tff7b72= Tff7b72False
Te6edf3start_time Tff7b72= Tff7b72None
Te6edf3hashlist_maxsize Tff7b72= T79c0ff1000000
Te6edf3job_interval Tff7b72= T79c0ff0.250
Te6edf3links_last_checked Tff7b72= T79c0ff0.0
Te6edf3links_check_interval Tff7b72= T79c0ff1.0
Te6edf3receipts_last_checked Tff7b72= T79c0ff0.0
Te6edf3receipts_check_interval Tff7b72= T79c0ff1.0
Te6edf3announces_last_checked Tff7b72= T79c0ff0.0
Te6edf3announces_check_interval Tff7b72= T79c0ff1.0
Te6edf3pending_prs_last_checked Tff7b72= T79c0ff0.0
Te6edf3pending_prs_check_interval Tff7b72= T79c0ff30.0
Te6edf3cache_last_cleaned Tff7b72= T79c0ff0.0
Te6edf3cache_clean_interval Tff7b72= T79c0ff5Tff7b72*T79c0ff60
Te6edf3destinations_last_cleaned Tff7b72= T79c0ff0.0
Te6edf3known_destinations_interval Tff7b72= T79c0ff5Tff7b72*T79c0ff60
Te6edf3tables_last_culled Tff7b72= T79c0ff0.0
Te6edf3tables_cull_interval Tff7b72= T79c0ff5.0
Te6edf3interface_last_jobs Tff7b72= T79c0ff0.0
Te6edf3interface_jobs_interval Tff7b72= T79c0ff5.0
Te6edf3last_mgmt_announce Tff7b72= T79c0ff0
Te6edf3mgmt_announce_interval Tff7b72= T79c0ff2Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3blackhole_last_checked Tff7b72= T79c0ff0
Te6edf3blackhole_check_interval Tff7b72= T79c0ff60
Te6edf3interface_announcer Tff7b72= Tff7b72None
Te6edf3discovery_handler Tff7b72= Tff7b72None
Te6edf3blackhole_updater Tff7b72= Tff7b72None
Te6edf3traffic_rxb Tff7b72= T79c0ff0
Te6edf3traffic_txb Tff7b72= T79c0ff0
Te6edf3speed_rx Tff7b72= T79c0ff0
Te6edf3speed_tx Tff7b72= T79c0ff0
Te6edf3traffic_captured Tff7b72= Tff7b72None
Te6edf3identity Tff7b72= Tff7b72None
Te6edf3network_identity Tff7b72= Tff7b72None
Te6edf3_identity Tff7b72= Tff7b72None
Te6edf3_should_run Tff7b72= Tff7b72True
Tf0883e@staticmethod
Tff7b72def Td2a8ffinternal_identityTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return Te6edf3TransportTff7b72.Td2a8ff_identity
Tf0883e@staticmethod
Tff7b72def Td2a8ffstartTb4b4b4(Te6edf3reticulum_instanceTb4b4b4)Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffowner Tff7b72= Te6edf3reticulum_instance
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffidentity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3transport_identity_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/transport_identityTa5d6ff"
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3transport_identity_pathTb4b4b4)Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3transport_identity_pathTb4b4b4)
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffidentity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo valid Transport Identity in storage, creating...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Te6edf3TransportTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3transport_identity_pathTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Transport Identity from storageTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Te6edf3TransportTff7b72.Td2a8ff_identity Tff7b72= Te6edf3TransportTff7b72.Td2a8ffidentity
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72and Tff7b72not Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstatic_transport_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ff_identity Tff7b72= Te6edf3TransportTff7b72.Td2a8ffidentity
Te6edf3TransportTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInitialized ephemeral transport identity Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fflocal_hops_deltaTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3TransportTff7b72.Td2a8fflocal_hops_delta Tff7b72= Tb4b4b4(Tffa657ordTb4b4b4(Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72%T79c0ff6Tb4b4b4)Tff7b72+T79c0ff2
Te6edf3packet_hashlist_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/packet_hashlist.rawTa5d6ff"
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72and Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3packet_hashlist_pathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3packet_hashlist_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fileTb4b4b4:
Te6edf3hashlen Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8
Te6edf3done Tff7b72= Tff7b72False
Tff7b72while Tff7b72not Te6edf3doneTb4b4b4:
Te6edf3packet_hash Tff7b72= Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Te6edf3hashlenTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3packet_hashTb4b4b4) Tff7b72== Te6edf3hashlenTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpacket_hashlistTff7b72.Td2a8ffaddTb4b4b4(Te6edf3packet_hashTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3done Tff7b72= Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load packet hashlist from storage, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffreload_blackholeTb4b4b4(Tb4b4b4)
T8b949e# Create transport-specific destinations
Te6edf3TransportTff7b72.Td2a8ffpath_request_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAINTb4b4b4, Te6edf3TransportTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrequestTa5d6ff"Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffpath_request_destinationTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpath_request_handlerTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffcontrol_destinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpath_request_destinationTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffcontrol_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpath_request_destinationTff7b72.Td2a8ffhashTb4b4b4)
Te6edf3TransportTff7b72.Td2a8fftunnel_synthesize_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAINTb4b4b4, Te6edf3TransportTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6fftunnelTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsynthesizeTa5d6ff"Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8fftunnel_synthesize_destinationTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Te6edf3TransportTff7b72.Td2a8fftunnel_synthesize_handlerTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffcontrol_destinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8fftunnel_synthesize_handlerTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffcontrol_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8fftunnel_synthesize_destinationTff7b72.Td2a8ffhashTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffremote_management_enabledTb4b4b4(Tb4b4b4) Tff7b72and Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffremote_management_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3TransportTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffremoteTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmanagementTa5d6ff"Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffremote_management_destinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Ta5d6ff"Ta5d6ff/statusTa5d6ff"Tb4b4b4, Te6edf3response_generator Tff7b72= Te6edf3TransportTff7b72.Td2a8ffremote_status_handlerTb4b4b4, Te6edf3allow Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_LISTTb4b4b4, Te6edf3allowed_listTff7b72=Te6edf3TransportTff7b72.Td2a8ffremote_management_allowedTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffremote_management_destinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Ta5d6ff"Ta5d6ff/pathTa5d6ff"Tb4b4b4, Te6edf3response_generator Tff7b72= Te6edf3TransportTff7b72.Td2a8ffremote_path_handlerTb4b4b4, Te6edf3allow Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_LISTTb4b4b4, Te6edf3allowed_listTff7b72=Te6edf3TransportTff7b72.Td2a8ffremote_management_allowedTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffmgmt_destinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffremote_management_destinationTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffmgmt_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffremote_management_destinationTff7b72.Td2a8ffhashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEnabled remote management on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffremote_management_destinationTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffpublish_blackhole_enabledTb4b4b4(Tb4b4b4) Tff7b72and Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffblackhole_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3TransportTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffblackholeTa5d6ff"Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffblackhole_destinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Ta5d6ff"Ta5d6ff/listTa5d6ff"Tb4b4b4, Te6edf3response_generator Tff7b72= Te6edf3TransportTff7b72.Td2a8ffblackhole_list_handlerTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffmgmt_destinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffblackhole_destinationTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffmgmt_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffblackhole_destinationTff7b72.Td2a8ffhashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEnabled blackhole list publishing for transport identity Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffnetwork_identity Tff7b72and Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffinstance_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffnetwork_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3TransportTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffnetworkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinstanceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffnetwork_identityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffnetwork_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffnetwork_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3TransportTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffnetworkTa5d6ff"Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffmgmt_destinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffinstance_destinationTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffmgmt_destinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffnetwork_destinationTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffmgmt_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffinstance_destinationTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffmgmt_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffnetwork_destinationTb4b4b4)
T8b949e# Defer cleaning packet cache for 60 seconds
Te6edf3TransportTff7b72.Td2a8ffcache_last_cleaned Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff60
T8b949e# Defer cleaning known destinations
Te6edf3TransportTff7b72.Td2a8ffdestinations_last_cleaned Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# Defer sending management announces for 15 seconds
Te6edf3TransportTff7b72.Td2a8fflast_mgmt_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3TransportTff7b72.Td2a8ffmgmt_announce_interval Tff7b72+ T79c0ff15
T8b949e# Start job loops
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3TransportTff7b72.Td2a8ffjobloopTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3TransportTff7b72.Td2a8ffcount_traffic_loopTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# Load transport-related data
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3path_table_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/destination_tableTa5d6ff"
Te6edf3tunnel_table_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/tunnelsTa5d6ff"
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3path_table_pathTb4b4b4) Tff7b72and Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3serialised_destinations Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72tryTb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3path_table_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3serialised_destinations Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3serialised_entry Tff7b72in Te6edf3serialised_destinationsTb4b4b4:
Te6edf3destination_hash Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Te6edf3timestamp Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3received_from Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3hops Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff3Tb4b4b4]
Te6edf3expires Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff4Tb4b4b4]
Te6edf3random_blobs Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff5Tb4b4b4]
Te6edf3receiving_interface Tff7b72= Te6edf3TransportTff7b72.Td2a8fffind_interface_from_hashTb4b4b4(Te6edf3serialised_entryTb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4)
Te6edf3announce_packet Tff7b72= Te6edf3TransportTff7b72.Td2a8ffget_cached_packetTb4b4b4(Te6edf3serialised_entryTb4b4b4[T79c0ff7Tb4b4b4]Tb4b4b4, Te6edf3packet_typeTff7b72=Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4)
Te6edf3blackholed Tff7b72= Tff7b72False
Tff7b72if Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3path_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3path_identity Tff7b72in Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4: Te6edf3blackholed Tff7b72= Tff7b72True
Tff7b72del Te6edf3path_identity
Tff7b72if Te6edf3announce_packet Tff7b72!= Tff7b72None Tff7b72and Te6edf3receiving_interface Tff7b72!= Tff7b72None Tff7b72and Te6edf3blackholed Tff7b72== Tff7b72FalseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3announce_packetTff7b72.Td2a8ffunpackTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72continue
T8b949e# We increase the hops, since reading a packet
T8b949e# from cache is equivalent to receiving it again
T8b949e# over an interface. It is cached with it's non-
T8b949e# increased hop-count.
Te6edf3announce_packetTff7b72.Td2a8ffhops Tff7b72+Tff7b72= T79c0ff1
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Tb4b4b4[Te6edf3timestampTb4b4b4, Te6edf3received_fromTb4b4b4, Te6edf3hopsTb4b4b4, Te6edf3expiresTb4b4b4, Te6edf3random_blobsTb4b4b4, Te6edf3receiving_interfaceTb4b4b4, Te6edf3announce_packetTff7b72.Td2a8ffpacket_hashTb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded path table entry for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff from storageTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not reconstruct path table entry from storage for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3announce_packet Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe announce packet could not be loaded from cacheTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3receiving_interface Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe interface is no longer availableTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3blackholedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe associated identity is blackholedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4) Tff7b72== T79c0ff1Tb4b4b4: Te6edf3specifier Tff7b72= Ta5d6ff"Ta5d6ffentryTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3specifier Tff7b72= Ta5d6ff"Ta5d6ffentriesTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff path table Ta5d6ff"Tff7b72+Te6edf3specifierTff7b72+Ta5d6ff"Ta5d6ff from storageTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load destination table from storage, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3tunnel_table_pathTb4b4b4) Tff7b72and Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3serialised_tunnels Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72tryTb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3tunnel_table_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3serialised_tunnels Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3serialised_tunnel Tff7b72in Te6edf3serialised_tunnelsTb4b4b4:
Te6edf3tunnel_id Tff7b72= Te6edf3serialised_tunnelTb4b4b4[Te6edf3IDX_TT_TUNNEL_IDTb4b4b4]
Te6edf3interface_hash Tff7b72= Te6edf3serialised_tunnelTb4b4b4[Te6edf3IDX_TT_IFTb4b4b4]
Te6edf3serialised_paths Tff7b72= Te6edf3serialised_tunnelTb4b4b4[Te6edf3IDX_TT_PATHSTb4b4b4]
Te6edf3expires Tff7b72= Te6edf3serialised_tunnelTb4b4b4[Te6edf3IDX_TT_EXPIRESTb4b4b4]
Te6edf3tunnel_paths Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3serialised_entry Tff7b72in Te6edf3serialised_pathsTb4b4b4:
Te6edf3destination_hash Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3timestamp Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3received_from Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3hops Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff3Tb4b4b4]
Te6edf3expires Tff7b72= Te6edf3serialised_entryTb4b4b4[T79c0ff4Tb4b4b4]
Te6edf3random_blobs Tff7b72= Tffa657listTb4b4b4(Tffa657setTb4b4b4(Te6edf3serialised_entryTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3receiving_interface Tff7b72= Te6edf3TransportTff7b72.Td2a8fffind_interface_from_hashTb4b4b4(Te6edf3serialised_entryTb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4)
Te6edf3announce_packet Tff7b72= Te6edf3TransportTff7b72.Td2a8ffget_cached_packetTb4b4b4(Te6edf3serialised_entryTb4b4b4[T79c0ff7Tb4b4b4]Tb4b4b4, Te6edf3packet_typeTff7b72=Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3announce_packet Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3announce_packetTff7b72.Td2a8ffunpackTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72continue
T8b949e# We increase the hops, since reading a packet
T8b949e# from cache is equivalent to receiving it again
T8b949e# over an interface. It is cached with it's non-
T8b949e# increased hop-count.
Te6edf3announce_packetTff7b72.Td2a8ffhops Tff7b72+Tff7b72= T79c0ff1
Te6edf3tunnel_path Tff7b72= Tb4b4b4[Te6edf3timestampTb4b4b4, Te6edf3received_fromTb4b4b4, Te6edf3hopsTb4b4b4, Te6edf3expiresTb4b4b4, Te6edf3random_blobsTb4b4b4, Te6edf3receiving_interfaceTb4b4b4, Te6edf3announce_packetTff7b72.Td2a8ffpacket_hashTb4b4b4]
Te6edf3tunnel_pathsTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3tunnel_path
Tff7b72if Tffa657lenTb4b4b4(Te6edf3tunnel_pathsTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3tunnel Tff7b72= Tb4b4b4[Te6edf3tunnel_idTb4b4b4, Tff7b72NoneTb4b4b4, Te6edf3tunnel_pathsTb4b4b4, Te6edf3expiresTb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8fftunnels_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4[Te6edf3tunnel_idTb4b4b4] Tff7b72= Te6edf3tunnel
Tff7b72if Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4) Tff7b72== T79c0ff1Tb4b4b4: Te6edf3specifier Tff7b72= Ta5d6ff"Ta5d6ffentryTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3specifier Tff7b72= Ta5d6ff"Ta5d6ffentriesTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff tunnel table Ta5d6ff"Tff7b72+Te6edf3specifierTff7b72+Ta5d6ff"Ta5d6ff from storageTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load tunnel table from storage, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffprobe_destination_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffprobe_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3TransportTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffprobeTa5d6ff"Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffprobe_destinationTff7b72.Td2a8ffaccepts_linksTb4b4b4(Tff7b72FalseTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffprobe_destinationTff7b72.Td2a8ffset_proof_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPROVE_ALLTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffmgmt_destinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffprobe_destinationTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTransport Instance will respond to probe requests on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffprobe_destinationTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffprobe_destination Tff7b72= Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTransport instance Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffidentityTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff startedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Te6edf3TransportTff7b72.Td2a8ffstart_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# Sort interfaces according to bitrate
Te6edf3TransportTff7b72.Td2a8ffprioritize_interfacesTb4b4b4(Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffready Tff7b72= Tff7b72True
T8b949e# Synthesize tunnels for any interfaces wanting it
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3interfaceTff7b72.Td2a8fftunnel_id Tff7b72= Tff7b72None
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffwants_tunnelTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffwants_tunnelTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffsynthesize_tunnelTb4b4b4(Te6edf3interfaceTb4b4b4)
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffadd_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffinterfaces_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffinterfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffremove_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffinterfaces_lockTb4b4b4:
Tff7b72if Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffinterfacesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3interfaceTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffset_network_identityTb4b4b4(Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffnetwork_identityTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffnetwork_identity Tff7b72= Te6edf3identity
Tf0883e@staticmethod
Tff7b72def Td2a8ffhas_network_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffnetwork_identityTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffprioritize_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffinterfaces_lockTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffinterfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3interfaceTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffbitrateTb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not prioritize interfaces according to bitrate. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffenable_discoveryTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffinterface_announcerTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffinterface_announcer Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDiscoveryTff7b72.Td2a8ffInterfaceAnnouncerTb4b4b4(Te6edf3TransportTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffinterface_announcerTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffdiscover_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffdiscovery_handlerTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffdiscovery_handler Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDiscoveryTff7b72.Td2a8ffInterfaceDiscoveryTb4b4b4(Te6edf3required_valueTff7b72=Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffrequired_discovery_valueTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3discover_interfacesTff7b72=Tff7b72TrueTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffenable_blackhole_updaterTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffblackhole_updaterTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffblackhole_updater Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDiscoveryTff7b72.Td2a8ffBlackholeUpdaterTb4b4b4(Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffblackhole_updaterTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffcount_traffic_loopTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3rxb Tff7b72= T79c0ff0Tb4b4b4; Te6edf3txb Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3rxs Tff7b72= T79c0ff0Tb4b4b4; Te6edf3txs Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3interfaceTff7b72.Td2a8ffparent_interface Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6fftransport_traffic_counterTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3irxb Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffrxbTb4b4b4; Te6edf3itxb Tff7b72= Te6edf3interfaceTff7b72.Td2a8fftxb
Te6edf3tc Tff7b72= Te6edf3interfaceTff7b72.Td2a8fftransport_traffic_counter
Te6edf3rx_diff Tff7b72= Te6edf3irxb Tff7b72- Te6edf3tcTb4b4b4[Ta5d6ff"Ta5d6ffrxbTa5d6ff"Tb4b4b4]
Te6edf3tx_diff Tff7b72= Te6edf3itxb Tff7b72- Te6edf3tcTb4b4b4[Ta5d6ff"Ta5d6fftxbTa5d6ff"Tb4b4b4]
Te6edf3ts_diff Tff7b72= Te6edf3now Tff7b72- Te6edf3tcTb4b4b4[Ta5d6ff"Ta5d6fftsTa5d6ff"Tb4b4b4]
Te6edf3rxb Tff7b72+Tff7b72= Te6edf3rx_diffTb4b4b4; Te6edf3crxs Tff7b72= Tb4b4b4(Te6edf3rx_diffTff7b72*T79c0ff8Tb4b4b4)Tff7b72/Te6edf3ts_diff
Te6edf3txb Tff7b72+Tff7b72= Te6edf3tx_diffTb4b4b4; Te6edf3ctxs Tff7b72= Tb4b4b4(Te6edf3tx_diffTff7b72*T79c0ff8Tb4b4b4)Tff7b72/Te6edf3ts_diff
Te6edf3interfaceTff7b72.Td2a8ffcurrent_rx_speed Tff7b72= Te6edf3crxsTb4b4b4; Te6edf3rxs Tff7b72+Tff7b72= Te6edf3crxs
Te6edf3interfaceTff7b72.Td2a8ffcurrent_tx_speed Tff7b72= Te6edf3ctxsTb4b4b4; Te6edf3txs Tff7b72+Tff7b72= Te6edf3ctxs
Te6edf3tcTb4b4b4[Ta5d6ff"Ta5d6ffrxbTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3irxbTb4b4b4;
Te6edf3tcTb4b4b4[Ta5d6ff"Ta5d6fftxbTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3itxbTb4b4b4;
Te6edf3tcTb4b4b4[Ta5d6ff"Ta5d6fftsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nowTb4b4b4;
Tff7b72elseTb4b4b4:
Te6edf3interfaceTff7b72.Td2a8fftransport_traffic_counter Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftsTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffrxbTa5d6ff"Tb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffrxbTb4b4b4, Ta5d6ff"Ta5d6fftxbTa5d6ff"Tb4b4b4: Te6edf3interfaceTff7b72.Td2a8fftxbTb4b4b4}
Te6edf3TransportTff7b72.Td2a8fftraffic_rxb Tff7b72+Tff7b72= Te6edf3rxb
Te6edf3TransportTff7b72.Td2a8fftraffic_txb Tff7b72+Tff7b72= Te6edf3txb
Te6edf3TransportTff7b72.Td2a8ffspeed_rx Tff7b72= Te6edf3rxs
Te6edf3TransportTff7b72.Td2a8ffspeed_tx Tff7b72= Te6edf3txs
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred while counting interface traffic: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffjobloopTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72while Tb4b4b4(Te6edf3TransportTff7b72.Td2a8ff_should_runTb4b4b4)Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffjobsTb4b4b4(Tb4b4b4)
Te6edf3sleepTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffjob_intervalTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffjobsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3outgoing Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3path_requests Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3blocked_if Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffjobs_lockTb4b4b4:
Te6edf3should_collect Tff7b72= Tff7b72False
T8b949e# Process active and pending link lists
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8fflinks_last_checkedTff7b72+Te6edf3TransportTff7b72.Td2a8fflinks_check_intervalTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpending_links_lockTb4b4b4:
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpending_linksTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4:
T8b949e# If we are not a Transport Instance, finding a pending link
T8b949e# that was never activated will trigger an expiry of the path
T8b949e# to the destination, and an attempt to rediscover the path.
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffexpire_pathTb4b4b4(Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)
T8b949e# If we are connected to a shared instance, it will take
T8b949e# care of sending out a new path request. If not, we will
T8b949e# send one directly.
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3last_path_request Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_requests_lockTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_requestsTb4b4b4:
Te6edf3last_path_request Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_requestsTb4b4b4[Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4]
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3last_path_request Tff7b72> Te6edf3TransportTff7b72.Td2a8ffPATH_REQUEST_MITb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTrying to rediscover path for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since an attempted link was never establishedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Tff7b72not Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhash Tff7b72in Te6edf3path_requestsTb4b4b4:
Te6edf3blocked_if Tff7b72= Tff7b72None
Te6edf3path_requestsTb4b4b4[Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4] Tff7b72= Te6edf3blocked_if
Te6edf3TransportTff7b72.Td2a8ffpending_linksTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3linkTb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffactive_links_lockTb4b4b4:
Te6edf3closed_links Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffactive_linksTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4: Te6edf3closed_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3linkTb4b4b4)
Tff7b72for Te6edf3closed_link Tff7b72in Te6edf3closed_linksTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffactive_linksTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3closed_linkTb4b4b4)
Te6edf3TransportTff7b72.Td2a8fflinks_last_checked Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# Process receipts list for timed-out packets
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffreceipts_last_checkedTff7b72+Te6edf3TransportTff7b72.Td2a8ffreceipts_check_intervalTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffreceipts_lockTb4b4b4:
Tff7b72while Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffreceiptsTb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffMAX_RECEIPTSTb4b4b4:
Te6edf3culled_receipt Tff7b72= Te6edf3TransportTff7b72.Td2a8ffreceiptsTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3culled_receiptTff7b72.Td2a8fftimeout Tff7b72= Tff7b72-T79c0ff1
Te6edf3culled_receiptTff7b72.Td2a8ffcheck_timeoutTb4b4b4(Tb4b4b4)
Te6edf3should_collect Tff7b72= Tff7b72True
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffreceipts_lockTb4b4b4:
Te6edf3expired_receipts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3receipt Tff7b72in Te6edf3TransportTff7b72.Td2a8ffreceiptsTb4b4b4:
Te6edf3receiptTff7b72.Td2a8ffcheck_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3receiptTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketReceiptTff7b72.Td2a8ffSENTTb4b4b4: Te6edf3expired_receiptsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3receiptTb4b4b4)
Tff7b72for Te6edf3expired_receipt Tff7b72in Te6edf3expired_receiptsTb4b4b4:
Tff7b72if Te6edf3expired_receipt Tff7b72in Te6edf3TransportTff7b72.Td2a8ffreceiptsTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffreceiptsTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3expired_receiptTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffreceipts_last_checked Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# Process announces needing retransmission
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffannounces_last_checkedTff7b72+Te6edf3TransportTff7b72.Td2a8ffannounces_check_intervalTb4b4b4:
Te6edf3completed_announces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_table_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4:
Te6edf3announce_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]
Tff7b72if Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_RETRIESTb4b4b4] Tff7b72> T79c0ff0 Tff7b72and Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_RETRIESTb4b4b4] Tff7b72>Tff7b72= Te6edf3TransportTff7b72.Td2a8ffLOCAL_REBROADCASTS_MAXTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompleted announce processing for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, local rebroadcast limit reachedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3completed_announcesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72elif Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_RETRIESTb4b4b4] Tff7b72> Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_RTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompleted announce processing for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, retry limit reachedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3completed_announcesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_RTRNS_TMOTb4b4b4]Tb4b4b4:
Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_RTRNS_TMOTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_G Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_RW
Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_RETRIESTb4b4b4] Tff7b72+Tff7b72= T79c0ff1
Te6edf3packet Tff7b72= Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_PACKETTb4b4b4]
Te6edf3block_rebroadcasts Tff7b72= Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_BLCK_RBRDTb4b4b4]
Te6edf3attached_interface Tff7b72= Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_ATTCHD_IFTb4b4b4]
Te6edf3announce_context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffNONE
Tff7b72if Te6edf3block_rebroadcastsTb4b4b4: Te6edf3announce_context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPATH_RESPONSE
Te6edf3announce_data Tff7b72= Te6edf3packetTff7b72.Td2a8ffdata
Te6edf3announce_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Tff7b72not Te6edf3announce_identityTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompleted announce processing for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, the path was cleaned while waiting for announce rebroadcastTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3completed_announcesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3announce_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3announce_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3announce_destinationTff7b72.Td2a8ffhash Tff7b72= Te6edf3packetTff7b72.Td2a8ffdestination_hash
Te6edf3announce_destinationTff7b72.Td2a8ffhexhash Tff7b72= Te6edf3announce_destinationTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3new_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3announce_destinationTb4b4b4,
Te6edf3announce_dataTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4,
Te6edf3context Tff7b72= Te6edf3announce_contextTb4b4b4,
Te6edf3header_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_2Tb4b4b4,
Te6edf3transport_type Tff7b72= Te6edf3TransportTff7b72.Td2a8ffTRANSPORTTb4b4b4,
Te6edf3transport_id Tff7b72= Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3attached_interface Tff7b72= Te6edf3attached_interfaceTb4b4b4,
Te6edf3context_flag Tff7b72= Te6edf3packetTff7b72.Td2a8ffcontext_flagTb4b4b4)
Te6edf3new_packetTff7b72.Td2a8ffhops Tff7b72= Te6edf3announce_entryTb4b4b4[T79c0ff4Tb4b4b4]
Tff7b72if Te6edf3block_rebroadcastsTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRebroadcasting announce as path response for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3announce_destinationTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with hop count Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3new_packetTff7b72.Td2a8ffhopsTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRebroadcasting announce for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3announce_destinationTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with hop count Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3new_packetTff7b72.Td2a8ffhopsTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(Te6edf3new_packetTb4b4b4)
T8b949e# This handles an edge case where a peer sends a path
T8b949e# request for a destination just after an announce for
T8b949e# said destination has arrived, but before it has been
T8b949e# rebroadcast locally. In such a case the actual announce
T8b949e# is temporarily held, and then reinserted when the path
T8b949e# request has been served to the peer.
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffheld_announcesTb4b4b4:
Te6edf3held_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffheld_announcesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3held_entry
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReinserting held announce into tableTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3completed_announcesTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffannounce_tableTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffannounces_last_checked Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# Cull the packet hashlist if it has reached its max size
Tff7b72if Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpacket_hashlistTb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffhashlist_maxsizeTff7b72/Tff7b72/T79c0ff2Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpacket_hashlist_prev Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpacket_hashlist
Te6edf3TransportTff7b72.Td2a8ffpacket_hashlist Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
T8b949e# Cull invalidated path requests
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffpending_prs_last_checkedTff7b72+Te6edf3TransportTff7b72.Td2a8ffpending_prs_check_intervalTb4b4b4:
Te6edf3stale_local_prs Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpending_local_prs_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpending_local_path_requestsTb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffpending_local_path_requestsTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3stale_local_prsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3stale_local_prsTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpending_local_path_requestsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffpending_prs_last_checked Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# Cull the path request tags list if it has reached its max size
Tff7b72if Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tagsTb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffmax_pr_tagsTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tags_lockTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tags Tff7b72= Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tagsTb4b4b4[Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tagsTb4b4b4)Tff7b72-Te6edf3TransportTff7b72.Td2a8ffmax_pr_tagsTb4b4b4:Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tagsTb4b4b4)Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8fftables_last_culled Tff7b72+ Te6edf3TransportTff7b72.Td2a8fftables_cull_intervalTb4b4b4:
T8b949e# Remove unneeded path state entries
Te6edf3stale_path_states Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_states_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_statesTb4b4b4:
Tff7b72if Tff7b72not Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3stale_path_statesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
T8b949e# Cull the reverse table according to timeout
Te6edf3stale_reverse_entries Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffreverse_table_lockTb4b4b4:
Tff7b72for Te6edf3truncated_packet_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffreverse_tableTb4b4b4:
Te6edf3reverse_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffreverse_tableTb4b4b4[Te6edf3truncated_packet_hashTb4b4b4]
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3reverse_entryTb4b4b4[Te6edf3IDX_RT_TIMESTAMPTb4b4b4] Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffREVERSE_TIMEOUTTb4b4b4: Te6edf3stale_reverse_entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3truncated_packet_hashTb4b4b4)
Tff7b72elif Tff7b72not Te6edf3reverse_entryTb4b4b4[Te6edf3IDX_RT_OUTB_IFTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4: Te6edf3stale_reverse_entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3truncated_packet_hashTb4b4b4)
Tff7b72elif Tff7b72not Te6edf3reverse_entryTb4b4b4[Te6edf3IDX_RT_RCVD_IFTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4: Te6edf3stale_reverse_entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3truncated_packet_hashTb4b4b4)
T8b949e# Cull the link table according to timeout
Te6edf3stale_links Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8fflink_table_lockTb4b4b4:
Tff7b72for Te6edf3link_id Tff7b72in Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4:
Te6edf3link_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4[Te6edf3link_idTb4b4b4]
Tff7b72if Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_VALIDATEDTb4b4b4] Tff7b72== Tff7b72TrueTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_TIMESTAMPTb4b4b4] Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffLINK_TIMEOUTTb4b4b4: Te6edf3stale_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3link_idTb4b4b4)
Tff7b72elif Tff7b72not Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_NH_IFTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4: Te6edf3stale_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3link_idTb4b4b4)
Tff7b72elif Tff7b72not Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4: Te6edf3stale_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3link_idTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_PROOF_TMOTb4b4b4]Tb4b4b4:
Te6edf3stale_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3link_idTb4b4b4)
Te6edf3last_path_request Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_requests_lockTb4b4b4:
Tff7b72if Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_requestsTb4b4b4:
Te6edf3last_path_request Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_requestsTb4b4b4[Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4]
Te6edf3lr_taken_hops Tff7b72= Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_HOPSTb4b4b4]
Te6edf3path_request_throttle Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3last_path_request Tff7b72< Te6edf3TransportTff7b72.Td2a8ffPATH_REQUEST_MI
Te6edf3path_request_conditions Tff7b72= Tff7b72False
T8b949e# If the path has been invalidated between the time of
T8b949e# making the link request and now, try to rediscover it
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTrying to rediscover path for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since an attempted link was never established, and path is now missingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3path_request_conditions Tff7b72= Tff7b72True
T8b949e# If this link request was originated from a local client
T8b949e# attempt to rediscover a path to the destination, if this
T8b949e# has not already happened recently.
Tff7b72elif Tff7b72not Te6edf3path_request_throttle Tff7b72and Te6edf3lr_taken_hops Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTrying to rediscover path for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since an attempted local client link was never establishedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3path_request_conditions Tff7b72= Tff7b72True
T8b949e# If the link destination was previously only 1 hop
T8b949e# away, this likely means that it was local to one
T8b949e# of our interfaces, and that it roamed somewhere else.
T8b949e# In that case, try to discover a new path, and mark
T8b949e# the old one as unresponsive.
Tff7b72elif Tff7b72not Te6edf3path_request_throttle Tff7b72and Te6edf3TransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4) Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTrying to rediscover path for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since an attempted link was never established, and destination was previously local to an interface on this instanceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3path_request_conditions Tff7b72= Tff7b72True
Te6edf3blocked_if Tff7b72= Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]
T8b949e# TODO: This might result in the path re-resolution
T8b949e# only being able to happen once, since new path found
T8b949e# after allowing update from higher hop-count path, after
T8b949e# marking old path unresponsive, might be more than 1 hop away,
T8b949e# thus dealocking us into waiting for a new announce all-together.
T8b949e# Is this problematic, or does it actually not matter?
T8b949e# Best would be to have full support for alternative paths,
T8b949e# and score them according to number of unsuccessful tries or
T8b949e# similar.
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]Tff7b72.Td2a8ffmode Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_BOUNDARYTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffmark_path_unresponsiveTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4)
T8b949e# If the link initiator is only 1 hop away,
T8b949e# this likely means that network topology has
T8b949e# changed. In that case, we try to discover a new path,
T8b949e# and mark the old one as potentially unresponsive.
Tff7b72elif Tff7b72not Te6edf3path_request_throttle Tff7b72and Te6edf3lr_taken_hops Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTrying to rediscover path for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since an attempted link was never established, and link initiator is local to an interface on this instanceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3path_request_conditions Tff7b72= Tff7b72True
Te6edf3blocked_if Tff7b72= Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]Tff7b72.Td2a8ffmode Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_BOUNDARYTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffmark_path_unresponsiveTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3path_request_conditionsTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_requests_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4] Tff7b72in Te6edf3path_requestsTb4b4b4:
Te6edf3path_requestsTb4b4b4[Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4] Tff7b72= Te6edf3blocked_if
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# Drop current path if we are not a transport instance, to
T8b949e# allow using higher-hop count paths or reused announces
T8b949e# from newly adjacent transport instances.
Te6edf3TransportTff7b72.Td2a8ffexpire_pathTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4)
T8b949e# Cull the path table
Te6edf3stale_paths Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3destination_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]
Te6edf3attached_interface Tff7b72= Te6edf3destination_entryTb4b4b4[Te6edf3IDX_PT_RVCD_IFTb4b4b4]
Tff7b72if Te6edf3attached_interface Tff7b72!= Tff7b72None Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3attached_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3attached_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ACCESS_POINTTb4b4b4:
Te6edf3destination_expiry Tff7b72= Te6edf3destination_entryTb4b4b4[Te6edf3IDX_PT_TIMESTAMPTb4b4b4] Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffAP_PATH_TIME
Tff7b72elif Te6edf3attached_interface Tff7b72!= Tff7b72None Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3attached_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3attached_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMINGTb4b4b4:
Te6edf3destination_expiry Tff7b72= Te6edf3destination_entryTb4b4b4[Te6edf3IDX_PT_TIMESTAMPTb4b4b4] Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffROAMING_PATH_TIME
Tff7b72elseTb4b4b4:
Te6edf3destination_expiry Tff7b72= Te6edf3destination_entryTb4b4b4[Te6edf3IDX_PT_TIMESTAMPTb4b4b4] Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffDESTINATION_TIMEOUT
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3destination_expiryTb4b4b4:
Te6edf3stale_pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3should_collect Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff timed out and was removedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elif Tff7b72not Te6edf3attached_interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3stale_pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3should_collect Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was removed since the attached interface no longer existsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
T8b949e# Cull the pending path requests table
Te6edf3stale_path_requests Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_requests_lockTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_requestsTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffpath_requestsTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffPATH_REQUEST_GATE_TIMEOUTTb4b4b4:
Te6edf3stale_path_requestsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPath request entry for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff timed out and was removedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not complete stale path request enumeration in this job round, retrying later: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
T8b949e# Cull the pending discovery path requests table
Te6edf3stale_discovery_path_requests Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdiscovery_path_requestsTb4b4b4:
Te6edf3entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffdiscovery_path_requestsTb4b4b4[Te6edf3destination_hashTb4b4b4]
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftimeoutTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3stale_discovery_path_requestsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3should_collect Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffWaiting path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff timed out and was removedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
T8b949e# Cull the tunnel table
Te6edf3stale_tunnels Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4; Te6edf3ti Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8fftunnels_lockTb4b4b4:
Tff7b72for Te6edf3tunnel_id Tff7b72in Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4:
Te6edf3tunnel_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4[Te6edf3tunnel_idTb4b4b4]
Te6edf3expires Tff7b72= Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_EXPIRESTb4b4b4]
Tff7b72if Te6edf3expires Tff7b72> Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffTUNNEL_TIMEOUTTff7b72*T79c0ff2Tb4b4b4:
Te6edf3stale_tunnelsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3tunnel_idTb4b4b4)Tb4b4b4; Te6edf3should_collect Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTunnel Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3tunnel_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with excessive expiry was removedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elif Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3expiresTb4b4b4:
Te6edf3stale_tunnelsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3tunnel_idTb4b4b4)Tb4b4b4; Te6edf3should_collect Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTunnel Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3tunnel_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff timed out and was removedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_IFTb4b4b4] Tff7b72and Tff7b72not Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_IFTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRemoving non-existent tunnel interface Tffd700{Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_IFTb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_IFTb4b4b4] Tff7b72= Tff7b72None
Te6edf3stale_tunnel_paths Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3tunnel_paths Tff7b72= Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_PATHSTb4b4b4]
Tff7b72for Te6edf3tunnel_path Tff7b72in Te6edf3tunnel_pathsTb4b4b4:
Te6edf3tunnel_path_entry Tff7b72= Te6edf3tunnel_pathsTb4b4b4[Te6edf3tunnel_pathTb4b4b4]
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3tunnel_path_entryTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffTUNNEL_PATH_TIMEOUTTb4b4b4:
Te6edf3stale_tunnel_pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3tunnel_pathTb4b4b4)Tb4b4b4; Te6edf3should_collect Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTunnel path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3tunnel_pathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff timed out and was removedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3active_path Tff7b72= Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Te6edf3tunnel_path Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4: Te6edf3active_path Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3tunnel_pathTb4b4b4]
Tff7b72if Te6edf3active_pathTb4b4b4:
Te6edf3random_blobs Tff7b72= Te6edf3tunnel_path_entryTb4b4b4[T79c0ff4Tb4b4b4]
Te6edf3current_random_blobs Tff7b72= Te6edf3active_pathTb4b4b4[Te6edf3IDX_PT_RANDBLOBSTb4b4b4]
Te6edf3current_path_timebase Tff7b72= Te6edf3TransportTff7b72.Td2a8fftimebase_from_random_blobsTb4b4b4(Te6edf3current_random_blobsTb4b4b4)
Te6edf3tunnel_announce_timebase Tff7b72= Te6edf3TransportTff7b72.Td2a8fftimebase_from_random_blobsTb4b4b4(Te6edf3random_blobsTb4b4b4)
Tff7b72if Te6edf3current_path_timebase Tff7b72> Te6edf3tunnel_announce_timebaseTb4b4b4:
Te6edf3stale_tunnel_pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3tunnel_pathTb4b4b4)Tb4b4b4; Te6edf3should_collect Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTunnel path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3tunnel_pathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was removed due to more recent active pathTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72for Te6edf3tunnel_path Tff7b72in Te6edf3stale_tunnel_pathsTb4b4b4:
Te6edf3tunnel_pathsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3tunnel_pathTb4b4b4)
Te6edf3ti Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3ti Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3ti Tff7b72== T79c0ff1Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3tiTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff tunnel pathTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3tiTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff tunnel pathsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3i Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffreverse_table_lockTb4b4b4:
Tff7b72for Te6edf3truncated_packet_hash Tff7b72in Te6edf3stale_reverse_entriesTb4b4b4:
Tff7b72if Te6edf3truncated_packet_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffreverse_tableTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffreverse_tableTff7b72.Td2a8ffpopTb4b4b4(Te6edf3truncated_packet_hashTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReleased Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff reverse table entryTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReleased Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff reverse table entriesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3i Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8fflink_table_lockTb4b4b4:
Tff7b72for Te6edf3link_id Tff7b72in Te6edf3stale_linksTb4b4b4:
Te6edf3TransportTff7b72.Td2a8fflink_tableTff7b72.Td2a8ffpopTb4b4b4(Te6edf3link_idTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReleased Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff linkTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReleased Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff linksTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3i Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3stale_pathsTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpath_tableTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff pathTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff pathsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3i Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_requests_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3stale_path_requestsTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpath_requestsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff path request entryTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff path request entriesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3i Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3stale_discovery_path_requestsTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffdiscovery_path_requestsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff waiting path requestTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff waiting path requestsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3i Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8fftunnels_lockTb4b4b4:
Tff7b72for Te6edf3tunnel_id Tff7b72in Te6edf3stale_tunnelsTb4b4b4:
Te6edf3TransportTff7b72.Td2a8fftunnelsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3tunnel_idTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff tunnelTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff tunnelsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3i Tff7b72= T79c0ff0
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_states_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3stale_path_statesTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpath_statesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff path state entryTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff path state entriesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3TransportTff7b72.Td2a8fftables_last_culled Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# Run interface-related jobs
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffinterface_last_jobs Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffinterface_jobs_intervalTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffprioritize_interfacesTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3interfaceTff7b72.Td2a8ffshould_ingress_limitTb4b4b4(Tb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffshould_ingress_limit_prTb4b4b4(Tb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffprocess_held_announcesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffphy_keepaliveTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffsend_keepaliveTb4b4b4(Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffinterface_last_jobs Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while processing held per-interface announces: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPostponing until next job runTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
T8b949e# Clean packet caches
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffcache_last_cleanedTff7b72+Te6edf3TransportTff7b72.Td2a8ffcache_clean_intervalTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffcache_last_cleaned Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3TransportTff7b72.Td2a8ffclean_cacheTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# Clean known destinations
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffdestinations_last_cleanedTff7b72+Te6edf3TransportTff7b72.Td2a8ffknown_destinations_intervalTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffdestinations_last_cleaned Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffclean_known_destinationsTb4b4b4(Te6edf3backgroundTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while running scheduled known destinations cleaning: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72finallyTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffdestinations_last_cleaned Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# Send announces for management destinations
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8fflast_mgmt_announceTff7b72+Te6edf3TransportTff7b72.Td2a8ffmgmt_announce_intervalTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3TransportTff7b72.Td2a8fflast_mgmt_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3destination Tff7b72in Te6edf3TransportTff7b72.Td2a8ffmgmt_destinationsTb4b4b4: Te6edf3destinationTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while sending management announces: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
T8b949e# Check expired blackhole entries
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffblackhole_last_checkedTff7b72+Te6edf3TransportTff7b72.Td2a8ffblackhole_check_intervalTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffblackhole_last_checked Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3stale_blackhole_entries Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3until Tff7b72= Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4[Te6edf3identity_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffuntilTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3until Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3untilTb4b4b4: Te6edf3stale_blackhole_entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while checking blackhole expiry for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3i Tff7b72= T79c0ff0
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3stale_blackhole_entriesTb4b4b4:
Tff7b72if Te6edf3identity_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3identity_hashTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff blackholed identityTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff blackholed identitiesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while checking blackholed identities: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3should_collectTb4b4b4: Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn exception occurred while running Transport jobs.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4) T8b949e# TODO: Remove
Tff7b72if Te6edf3outgoingTb4b4b4:
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3TransportTff7b72.Td2a8ffhandle_outgoing_announcesTb4b4b4(Te6edf3outgoingTb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3path_requestsTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tx_lockTb4b4b4:
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3path_requestsTb4b4b4:
Tff7b72if Tff7b72not Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpending_discovery_prsTb4b4b4:
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpending_discovery_prsTb4b4b4) Tff7b72>Tff7b72= Te6edf3TransportTff7b72.Td2a8ffmax_queued_discovery_prsTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpending_discovery_prsTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4[Te6edf3destination_hashTb4b4b4, Te6edf3path_requestsTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4]Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpending_discovery_prsTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3TransportTff7b72.Td2a8ffhandle_disovery_path_requestsTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3discovery_pr_tx_throttle Tff7b72= T79c0ff0.5
Te6edf3discovery_pr_tx_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3discovery_pr_handle_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Te6edf3pending_discovery_prs Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3max_queued_discovery_prsTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffhandle_disovery_path_requestsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_handle_lockTff7b72.Td2a8fflockedTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_handle_lockTb4b4b4:
Tff7b72while Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpending_discovery_prsTb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tx_throttleTb4b4b4)
Te6edf3destination_hash Tff7b72= Tff7b72None
Te6edf3blocked_if Tff7b72= Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tx_lockTb4b4b4:
Te6edf3entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpending_discovery_prsTff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Te6edf3destination_hash Tff7b72= Te6edf3entryTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3blocked_if Tff7b72= Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3destination_hashTb4b4b4:
Tff7b72if Te6edf3blocked_if Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Te6edf3interface Tff7b72!= Te6edf3blocked_ifTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3on_interfaceTff7b72=Te6edf3interfaceTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72pass
Tf0883e@staticmethod
Tff7b72def Td2a8ffhandle_outgoing_announcesTb4b4b4(Te6edf3outgoingTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3packet Tff7b72in Tffa657sortedTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3pTb4b4b4: Te6edf3pTff7b72.Td2a8ffhopsTb4b4b4)Tb4b4b4: Te6edf3packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8fftransmitTb4b4b4(Te6edf3interfaceTb4b4b4, Te6edf3rawTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffifac_identityTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffifac_identity Tff7b72!= Tff7b72NoneTb4b4b4:
T8b949e# Calculate packet access code
Te6edf3ifac Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffifac_identityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4[Tff7b72-Te6edf3interfaceTff7b72.Td2a8ffifac_sizeTb4b4b4:Tb4b4b4]
T8b949e# Generate mask
Te6edf3mask Tff7b72= Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffhkdfTb4b4b4(Te6edf3lengthTff7b72=Tffa657lenTb4b4b4(Te6edf3rawTb4b4b4)Tff7b72+Te6edf3interfaceTff7b72.Td2a8ffifac_sizeTb4b4b4,
Te6edf3derive_fromTff7b72=Te6edf3ifacTb4b4b4,
Te6edf3saltTff7b72=Te6edf3interfaceTff7b72.Td2a8ffifac_keyTb4b4b4,
Te6edf3contextTff7b72=Tff7b72NoneTb4b4b4)
T8b949e# Set IFAC flag
Te6edf3new_header Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3rawTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72| T79c0ff0x80Tb4b4b4, Te6edf3rawTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4]Tb4b4b4)
T8b949e# Assemble new payload with IFAC
Te6edf3new_raw Tff7b72= Te6edf3new_headerTff7b72+Te6edf3ifacTff7b72+Te6edf3rawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
T8b949e# Mask payload
Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3masked_raw Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72for Te6edf3byte Tff7b72in Te6edf3new_rawTb4b4b4:
T8b949e# Mask first header byte, but make sure the
T8b949e# IFAC flag is still set
Tff7b72if Te6edf3i Tff7b72== T79c0ff0Tb4b4b4: Te6edf3masked_raw Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3byte Tff7b72^ Te6edf3maskTb4b4b4[Te6edf3iTb4b4b4] Tff7b72| T79c0ff0x80Tb4b4b4]Tb4b4b4)
T8b949e# Mask second header byte and payload
Tff7b72elif Te6edf3i Tff7b72== T79c0ff1 Tff7b72or Te6edf3i Tff7b72> Te6edf3interfaceTff7b72.Td2a8ffifac_sizeTff7b72+T79c0ff1Tb4b4b4: Te6edf3masked_raw Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3byte Tff7b72^ Te6edf3maskTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4]Tb4b4b4)
T8b949e# Don't mask the IFAC itself
Tff7b72elseTb4b4b4: Te6edf3masked_raw Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3byteTb4b4b4]Tb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
T8b949e# Send it
Te6edf3interfaceTff7b72.Td2a8ffprocess_outgoingTb4b4b4(Te6edf3masked_rawTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffprocess_outgoingTb4b4b4(Te6edf3rawTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while transmitting on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffoutboundTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
Te6edf3sent Tff7b72= Tff7b72False
Te6edf3outbound_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3generate_receipt Tff7b72= Tff7b72False
Tff7b72if Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffcreate_receipt Tff7b72== Tff7b72True Tff7b72and
T8b949e# Only generate receipts for DATA packets
Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffDATA Tff7b72and
T8b949e# Don't generate receipts for PLAIN destinations
Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8fftype Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAIN Tff7b72and
T8b949e# Don't generate receipts for link-related packets
Tff7b72not Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72>Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffKEEPALIVE Tff7b72and Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72<Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffLRPROOFTb4b4b4) Tff7b72and
T8b949e# Don't generate receipts for resource packets
Tff7b72not Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72>Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE Tff7b72and Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72<Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_RCLTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3generate_receipt Tff7b72= Tff7b72True
Tff7b72def Td2a8ffpacket_sentTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
Te6edf3packetTff7b72.Td2a8ffsent Tff7b72= Tff7b72True
Te6edf3packetTff7b72.Td2a8ffsent_at Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3generate_receiptTb4b4b4:
Te6edf3packetTff7b72.Td2a8ffreceipt Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketReceiptTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffreceipts_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffreceiptsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiptTb4b4b4)
T8b949e# TODO: Enable when caching has been redesigned
T8b949e# Transport.cache(packet)
T8b949e# Check if we have a known path for the destination in the path table
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCE Tff7b72and Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8fftype Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAIN Tff7b72and Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8fftype Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffGROUP Tff7b72and Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDropped packet since path table entry disappeared during outbound processingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Te6edf3path_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Te6edf3outbound_interface Tff7b72= Te6edf3path_entryTb4b4b4[Te6edf3IDX_PT_RVCD_IFTb4b4b4]
T8b949e# If there's more than one hop to the destination, and we know
T8b949e# a path, we insert the packet into transport by adding the next
T8b949e# transport nodes address to the header, and modifying the flags.
T8b949e# This rule applies both for "normal" transport, and when connected
T8b949e# to a local shared Reticulum instance.
Tff7b72if Te6edf3path_entryTb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4] Tff7b72> T79c0ff1Tb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffheader_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_1Tb4b4b4:
T8b949e# Insert packet into transport
Te6edf3new_flags Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_2Tb4b4b4) Tff7b72<< T79c0ff6 Tff7b72| Tb4b4b4(Te6edf3TransportTff7b72.Td2a8ffTRANSPORTTb4b4b4) Tff7b72<< T79c0ff4 Tff7b72| Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffflags Tff7b72& T79c0ff0b00001111Tb4b4b4)
Te6edf3new_raw Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3new_flagsTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff1Tb4b4b4:T79c0ff2Tb4b4b4] Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffshould_apply_deltaTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3outbound_interfaceTb4b4b4) Tff7b72else Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3TransportTff7b72.Td2a8fflocal_hops_deltaTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3path_entryTb4b4b4[Te6edf3IDX_PT_NEXT_HOPTb4b4b4]
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Te6edf3packet_sentTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3outbound_interfaceTb4b4b4, Te6edf3new_rawTb4b4b4)
Te6edf3path_entryTb4b4b4[Te6edf3IDX_PT_TIMESTAMPTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3sent Tff7b72= Tff7b72True
T8b949e# In the special case where we are connected to a local shared
T8b949e# Reticulum instance, and the destination is one hop away, we
T8b949e# also add transport headers to inject the packet into transport
T8b949e# via the shared instance. Normally a packet for a destination
T8b949e# one hop away would just be broadcast directly, but since we
T8b949e# are "behind" a shared instance, we need to get that instance
T8b949e# to transport it onto the network.
Tff7b72elif Te6edf3path_entryTb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4] Tff7b72== T79c0ff1 Tff7b72and Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffheader_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_1Tb4b4b4:
T8b949e# Insert packet into transport
Te6edf3new_flags Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_2Tb4b4b4) Tff7b72<< T79c0ff6 Tff7b72| Tb4b4b4(Te6edf3TransportTff7b72.Td2a8ffTRANSPORTTb4b4b4) Tff7b72<< T79c0ff4 Tff7b72| Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffflags Tff7b72& T79c0ff0b00001111Tb4b4b4)
Te6edf3new_raw Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3new_flagsTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff1Tb4b4b4:T79c0ff2Tb4b4b4] Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffshould_apply_deltaTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3outbound_interfaceTb4b4b4) Tff7b72else Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3TransportTff7b72.Td2a8fflocal_hops_deltaTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3path_entryTb4b4b4[Te6edf3IDX_PT_NEXT_HOPTb4b4b4]
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Te6edf3packet_sentTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3outbound_interfaceTb4b4b4, Te6edf3new_rawTb4b4b4)
Te6edf3path_entryTb4b4b4[Te6edf3IDX_PT_TIMESTAMPTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3sent Tff7b72= Tff7b72True
T8b949e# If none of the above applies, we know the destination is
T8b949e# directly reachable, and also on which interface, so we
T8b949e# simply transmit the packet directly on that one.
Tff7b72elseTb4b4b4:
Te6edf3packet_sentTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffshould_apply_deltaTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3outbound_interfaceTb4b4b4)Tb4b4b4: Te6edf3raw Tff7b72= Te6edf3packetTff7b72.Td2a8ffraw
Tff7b72elseTb4b4b4: Te6edf3raw Tff7b72= Te6edf3TransportTff7b72.Td2a8ffmangle_hopsTb4b4b4(Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4, Te6edf3TransportTff7b72.Td2a8fflocal_hops_deltaTb4b4b4)
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3outbound_interfaceTb4b4b4, Te6edf3rawTb4b4b4)
Te6edf3sent Tff7b72= Tff7b72True
T8b949e# If we don't have a known path for the destination, we'll
T8b949e# broadcast the packet on all outgoing interfaces, or the
T8b949e# just the relevant interface if the packet has an attached
T8b949e# interface, or belongs to a link.
Tff7b72elseTb4b4b4:
Te6edf3stored_hash Tff7b72= Tff7b72False
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffOUTTb4b4b4:
Te6edf3should_transmit Tff7b72= Tff7b72True
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffLINKTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4: Tff7b72continue
Tff7b72if Te6edf3interface Tff7b72!= Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffattached_interfaceTb4b4b4: Tff7b72continue
Tff7b72if Te6edf3packetTff7b72.Td2a8ffattached_interface Tff7b72!= Tff7b72None Tff7b72and Te6edf3interface Tff7b72!= Te6edf3packetTff7b72.Td2a8ffattached_interfaceTb4b4b4: Tff7b72continue
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffattached_interface Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3ac_loglevel Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_PATHING
Te6edf3from_interface Tff7b72= Te6edf3TransportTff7b72.Td2a8ffnext_hop_interfaceTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Te6edf3local_destination Tff7b72= Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4:
Te6edf3local_destination Tff7b72= Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Tff7b72if Tff7b72not Te6edf3local_destination Tff7b72and Te6edf3from_interface Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since next hop interface doesnTa5d6ff'Ta5d6fft existTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Te6edf3should_transmit Tff7b72= Tff7b72False
Tff7b72elif Tff7b72not Te6edf3local_destination Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffannounces_from_internal Tff7b72== Tff7b72False Tff7b72and Te6edf3from_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_INTERNALTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff due to internal-mode next hop interfaceTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Te6edf3should_transmit Tff7b72= Tff7b72False
Tff7b72elif Te6edf3interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ACCESS_POINTTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff due to AP modeTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Te6edf3should_transmit Tff7b72= Tff7b72False
Tff7b72elif Tff7b72not Te6edf3local_destination Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_INTERNALTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3from_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3should_transmit Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since next hop interface has no mode configuredTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3from_interfaceTff7b72.Td2a8ffannounces_to_internal Tff7b72== Tff7b72TrueTb4b4b4: Tff7b72pass
Tff7b72elif Te6edf3from_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_BOUNDARYTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff due to boundary-mode next-hop interfaceTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Te6edf3should_transmit Tff7b72= Tff7b72False
Tff7b72elif Te6edf3interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMINGTb4b4b4:
Tff7b72if Te6edf3local_destination Tff7b72!= Tff7b72NoneTb4b4b4:
T8b949e# RNS.log("Allowing announce broadcast on roaming-mode interface from instance-local destination", ac_loglevel) if RNS.sl(ac_loglevel) else None
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3from_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3should_transmit Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since next hop interface has no mode configuredTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3from_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMINGTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff due to roaming-mode next-hop interfaceTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Te6edf3should_transmit Tff7b72= Tff7b72False
Tff7b72elif Te6edf3from_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_BOUNDARYTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff due to boundary-mode next-hop interfaceTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Te6edf3should_transmit Tff7b72= Tff7b72False
Tff7b72elif Te6edf3interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_BOUNDARYTb4b4b4:
Tff7b72if Te6edf3local_destination Tff7b72!= Tff7b72NoneTb4b4b4:
T8b949e# RNS.log("Allowing announce broadcast on boundary-mode interface from instance-local destination", ac_loglevel) if RNS.sl(ac_loglevel) else None
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3from_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3should_transmit Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since next hop interface has no mode configuredTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3from_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMINGTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking announce broadcast on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff due to roaming-mode next-hop interfaceTa5d6ff"Tb4b4b4, Te6edf3ac_loglevelTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3ac_loglevelTb4b4b4) Tff7b72else Tff7b72None
Te6edf3should_transmit Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
T8b949e# Currently, annouces originating locally are always
T8b949e# allowed, and do not conform to bandwidth caps.
T8b949e# TODO: Rethink whether this is actually optimal.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffannounce_capTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffannounce_cap Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffANNOUNCE_CAP
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffannounce_allowed_atTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffannounce_allowed_at Tff7b72= T79c0ff0
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffannounce_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3queued_announces Tff7b72= Tff7b72True Tff7b72if Tffa657lenTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffannounce_queueTb4b4b4) Tff7b72> T79c0ff0 Tff7b72else Tff7b72False
Tff7b72if Tff7b72not Te6edf3queued_announces Tff7b72and Te6edf3outbound_time Tff7b72> Te6edf3interfaceTff7b72.Td2a8ffannounce_allowed_at Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffbitrate Tff7b72!= Tff7b72None Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffbitrate Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3tx_time Tff7b72= Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4)Tff7b72*T79c0ff8Tb4b4b4) Tff7b72/ Te6edf3interfaceTff7b72.Td2a8ffbitrate
Te6edf3wait_time Tff7b72= Tb4b4b4(Te6edf3tx_time Tff7b72/ Te6edf3interfaceTff7b72.Td2a8ffannounce_capTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffannounce_allowed_at Tff7b72= Te6edf3outbound_time Tff7b72+ Te6edf3wait_time
Tff7b72elseTb4b4b4:
Te6edf3should_transmit Tff7b72= Tff7b72False
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffannounce_queueTb4b4b4) Tff7b72>Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMAX_QUEUED_ANNOUNCESTb4b4b4:
Te6edf3should_queue Tff7b72= Tff7b72True
Te6edf3already_queued Tff7b72= Tff7b72False
Tff7b72for Te6edf3e Tff7b72in Te6edf3interfaceTff7b72.Td2a8ffannounce_queueTb4b4b4:
Tff7b72if Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffdestinationTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4:
Te6edf3already_queued Tff7b72= Tff7b72True
Te6edf3existing_entry Tff7b72= Te6edf3e
Te6edf3emission_timestamp Tff7b72= Te6edf3TransportTff7b72.Td2a8ffannounce_emittedTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72if Te6edf3already_queuedTb4b4b4:
Te6edf3should_queue Tff7b72= Tff7b72False
Tff7b72if Te6edf3emission_timestamp Tff7b72> Te6edf3existing_entryTb4b4b4[Ta5d6ff"Ta5d6ffemittedTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6fftimeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3outbound_time
Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffemittedTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3emission_timestamp
Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3packetTff7b72.Td2a8ffraw
Tff7b72if Te6edf3should_queueTb4b4b4:
Te6edf3entry Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffdestinationTa5d6ff"Tb4b4b4: Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4,
Ta5d6ff"Ta5d6fftimeTa5d6ff"Tb4b4b4: Te6edf3outbound_timeTb4b4b4,
Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4: Te6edf3packetTff7b72.Td2a8ffhopsTb4b4b4,
Ta5d6ff"Ta5d6ffemittedTa5d6ff"Tb4b4b4: Te6edf3TransportTff7b72.Td2a8ffannounce_emittedTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4: Te6edf3packetTff7b72.Td2a8ffraw Tb4b4b4}
Te6edf3queued_announces Tff7b72= Tff7b72True Tff7b72if Tffa657lenTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffannounce_queueTb4b4b4) Tff7b72> T79c0ff0 Tff7b72else Tff7b72False
Te6edf3interfaceTff7b72.Td2a8ffannounce_queueTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4)
Tff7b72if Tff7b72not Te6edf3queued_announcesTb4b4b4:
Te6edf3wait_time Tff7b72= Tffa657maxTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffannounce_allowed_at Tff7b72- Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3timer Tff7b72= Te6edf3threadingTff7b72.Td2a8ffTimerTb4b4b4(Te6edf3wait_timeTb4b4b4, Te6edf3interfaceTff7b72.Td2a8ffprocess_announce_queueTb4b4b4)
Te6edf3timerTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3wait_time Tff7b72< T79c0ff1Tb4b4b4: Te6edf3wait_time_str Tff7b72= Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3wait_timeTff7b72*T79c0ff1000Tb4b4b4,T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffmsTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3wait_time_str Tff7b72= Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3wait_timeTff7b72*T79c0ff1Tb4b4b4,T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3ql_str Tff7b72= Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffannounce_queueTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAdded announce to queue (height Ta5d6ff"Tff7b72+Te6edf3ql_strTff7b72+Ta5d6ff"Ta5d6ff) on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for processing in Ta5d6ff"Tff7b72+Te6edf3wait_time_strTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3wait_time Tff7b72= Tffa657maxTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffannounce_allowed_at Tff7b72- Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3wait_time Tff7b72< T79c0ff1Tb4b4b4: Te6edf3wait_time_str Tff7b72= Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3wait_timeTff7b72*T79c0ff1000Tb4b4b4,T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffmsTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3wait_time_str Tff7b72= Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3wait_timeTff7b72*T79c0ff1Tb4b4b4,T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3ql_str Tff7b72= Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffannounce_queueTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAdded announce to queue (height Ta5d6ff"Tff7b72+Te6edf3ql_strTff7b72+Ta5d6ff"Ta5d6ff) on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for processing in Ta5d6ff"Tff7b72+Te6edf3wait_time_strTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Tff7b72pass
Tff7b72elseTb4b4b4: Tff7b72pass
Tff7b72if Te6edf3should_transmitTb4b4b4:
Tff7b72if Tff7b72not Te6edf3stored_hashTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffadd_packet_hashTb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)
Te6edf3stored_hash Tff7b72= Tff7b72True
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffshould_apply_deltaTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4: Te6edf3raw Tff7b72= Te6edf3packetTff7b72.Td2a8ffraw
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4: Te6edf3raw Tff7b72= Te6edf3TransportTff7b72.Td2a8ffmangle_hopsTb4b4b4(Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4, Te6edf3TransportTff7b72.Td2a8fflocal_hops_deltaTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3raw Tff7b72= Te6edf3TransportTff7b72.Td2a8ffmangle_hopsTb4b4b4(Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4, Te6edf3TransportTff7b72.Td2a8fflocal_hops_deltaTb4b4b4, Te6edf3transport_insertTff7b72=Te6edf3packetTff7b72.Td2a8ffheader_typeTff7b72==Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_1Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3interfaceTb4b4b4, Te6edf3rawTb4b4b4)
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffsent_announceTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAIN Tff7b72and Te6edf3packetTff7b72.Td2a8ffis_outbound_prTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffsent_path_requestTb4b4b4(Tb4b4b4)
Te6edf3packet_sentTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3sent Tff7b72= Tff7b72True
Tff7b72return Te6edf3sent
Tf0883e@staticmethod
Tff7b72def Td2a8ffshould_apply_deltaTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72and Te6edf3packetTff7b72.Td2a8ffhops Tff7b72== T79c0ff0 Tff7b72and Te6edf3TransportTff7b72.Td2a8fflocal_hops_delta Tff7b72!= T79c0ff0 \
Tff7b72and Tff7b72not Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAIN Tff7b72and Tff7b72not Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffGROUP \
Tff7b72and Tff7b72not Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfaces Tff7b72and Tff7b72not Te6edf3TransportTff7b72.Td2a8ffis_shared_instanceTb4b4b4(Te6edf3interfaceTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffmangle_hopsTb4b4b4(Te6edf3rawTb4b4b4, Te6edf3hopsTb4b4b4, Te6edf3transport_insertTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3transport_insertTb4b4b4: Tff7b72return Te6edf3rawTb4b4b4[T79c0ff0Tb4b4b4:T79c0ff1Tb4b4b4]Tff7b72+Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3hopsTb4b4b4)Tff7b72+Te6edf3rawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Tffa657ordTb4b4b4(Te6edf3rawTb4b4b4[T79c0ff0Tb4b4b4:T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_2Tff7b72<<T79c0ff6Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3TransportTff7b72.Td2a8ffTRANSPORTTff7b72<<T79c0ff4Tb4b4b4)Tb4b4b4)Tff7b72+Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3hopsTb4b4b4)Tff7b72+Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTff7b72+Te6edf3rawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Tf0883e@staticmethod
Tff7b72def Td2a8ffadd_packet_hashTb4b4b4(Te6edf3packet_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpacket_hashlistTff7b72.Td2a8ffaddTb4b4b4(Te6edf3packet_hashTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffpacket_filterTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
T8b949e# If connected to a shared instance, it will handle
T8b949e# packet filtering
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4: Tff7b72return Tff7b72True
T8b949e# Filter packets intended for other transport instances
Tff7b72if Te6edf3packetTff7b72.Td2a8fftransport_id Tff7b72!= Tff7b72None Tff7b72and Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8fftransport_id Tff7b72!= Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIgnored packet Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff in transport for other transport instanceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72return Tff7b72False
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffKEEPALIVETb4b4b4: Tff7b72return Tff7b72True
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_REQTb4b4b4: Tff7b72return Tff7b72True
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_PRFTb4b4b4: Tff7b72return Tff7b72True
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCETb4b4b4: Tff7b72return Tff7b72True
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffCACHE_REQUESTTb4b4b4: Tff7b72return Tff7b72True
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffCHANNELTb4b4b4: Tff7b72return Tff7b72True
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAINTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72> T79c0ff1Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDropped PLAIN packet Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3packetTff7b72.Td2a8ffhopsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hopsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDropped invalid PLAIN announce packetTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return Tff7b72False
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72> T79c0ff1Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDropped GROUP packet Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3packetTff7b72.Td2a8ffhopsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hopsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDropped invalid GROUP announce packetTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return Tff7b72False
Tff7b72if Tff7b72not Te6edf3packetTff7b72.Td2a8ffpacket_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpacket_hashlist Tff7b72and Tff7b72not Te6edf3packetTff7b72.Td2a8ffpacket_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpacket_hashlist_prevTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDropped invalid announce packetTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffFiltered packet with hash Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffinboundTb4b4b4(Te6edf3rawTb4b4b4, Te6edf3interfaceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffreadyTb4b4b4:
Te6edf3wait_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72not Te6edf3TransportTff7b72.Td2a8ffreadyTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.25Tb4b4b4)
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3wait_start Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffREADY_WAITTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInbound packet timed out waiting for transport startup, droppingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return
T8b949e# If interface access codes are enabled,
T8b949e# we must authenticate each packet.
Tff7b72if Tffa657lenTb4b4b4(Te6edf3rawTb4b4b4) Tff7b72> T79c0ff2Tb4b4b4:
Tff7b72if Te6edf3interface Tff7b72!= Tff7b72None Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffifac_identityTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffifac_identity Tff7b72!= Tff7b72NoneTb4b4b4:
T8b949e# Check that IFAC flag is set
Tff7b72if Te6edf3rawTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x80 Tff7b72== T79c0ff0x80Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3rawTb4b4b4) Tff7b72> T79c0ff2Tff7b72+Te6edf3interfaceTff7b72.Td2a8ffifac_sizeTb4b4b4:
T8b949e# Extract IFAC
Te6edf3ifac Tff7b72= Te6edf3rawTb4b4b4[T79c0ff2Tb4b4b4:T79c0ff2Tff7b72+Te6edf3interfaceTff7b72.Td2a8ffifac_sizeTb4b4b4]
T8b949e# Generate mask
Te6edf3mask Tff7b72= Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffhkdfTb4b4b4(Te6edf3lengthTff7b72=Tffa657lenTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4, Te6edf3derive_fromTff7b72=Te6edf3ifacTb4b4b4,
Te6edf3saltTff7b72=Te6edf3interfaceTff7b72.Td2a8ffifac_keyTb4b4b4, Te6edf3contextTff7b72=Tff7b72NoneTb4b4b4)
T8b949e# Unmask payload
Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3unmasked_raw Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72for Te6edf3byte Tff7b72in Te6edf3rawTb4b4b4:
T8b949e# Unmask header bytes and payload
Tff7b72if Te6edf3i Tff7b72<Tff7b72= T79c0ff1 Tff7b72or Te6edf3i Tff7b72> Te6edf3interfaceTff7b72.Td2a8ffifac_sizeTff7b72+T79c0ff1Tb4b4b4: Te6edf3unmasked_raw Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3byte Tff7b72^ Te6edf3maskTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4]Tb4b4b4)
T8b949e# Don't unmask IFAC itself
Tff7b72elseTb4b4b4: Te6edf3unmasked_raw Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3byteTb4b4b4]Tb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Te6edf3raw Tff7b72= Te6edf3unmasked_raw
T8b949e# Unset IFAC flag
Te6edf3new_header Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3rawTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x7fTb4b4b4, Te6edf3rawTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4]Tb4b4b4)
T8b949e# Re-assemble packet
Te6edf3new_raw Tff7b72= Te6edf3new_headerTff7b72+Te6edf3rawTb4b4b4[T79c0ff2Tff7b72+Te6edf3interfaceTff7b72.Td2a8ffifac_sizeTb4b4b4:Tb4b4b4]
T8b949e# Calculate expected IFAC
Te6edf3expected_ifac Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffifac_identityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3new_rawTb4b4b4)Tb4b4b4[Tff7b72-Te6edf3interfaceTff7b72.Td2a8ffifac_sizeTb4b4b4:Tb4b4b4]
T8b949e# Check it
Tff7b72if Te6edf3ifac Tff7b72== Te6edf3expected_ifacTb4b4b4: Te6edf3raw Tff7b72= Te6edf3new_raw
Tff7b72elseTb4b4b4: Tff7b72return
Tff7b72elseTb4b4b4: Tff7b72return
T8b949e# If the IFAC flag is not set, but should be,
T8b949e# drop the packet.
Tff7b72elseTb4b4b4: Tff7b72return
Tff7b72elseTb4b4b4:
T8b949e# If the interface does not have IFAC enabled,
T8b949e# check the received packet IFAC flag.
T8b949e# If the flag is set, drop the packet
Tff7b72if Te6edf3rawTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x80 Tff7b72== T79c0ff0x80Tb4b4b4: Tff7b72return
Tff7b72elseTb4b4b4: Tff7b72return
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffidentity Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72return
Te6edf3packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3rawTb4b4b4)
Tff7b72if Tff7b72not Te6edf3packetTff7b72.Td2a8ffunpackTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72= Te6edf3interface
Te6edf3packetTff7b72.Td2a8ffhops Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_stat_rssiTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffr_stat_rssi Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3packetTff7b72.Td2a8ffrssi Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_stat_rssi
Te6edf3TransportTff7b72.Td2a8fflocal_client_rssi_cacheTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4[Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4, Te6edf3packetTff7b72.Td2a8ffrssiTb4b4b4]Tb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8fflocal_client_rssi_cacheTb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffLOCAL_CLIENT_CACHE_MAXSIZETb4b4b4:
Te6edf3TransportTff7b72.Td2a8fflocal_client_rssi_cacheTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_stat_snrTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffr_stat_rssi Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3packetTff7b72.Td2a8ffsnr Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_stat_snr
Te6edf3TransportTff7b72.Td2a8fflocal_client_snr_cacheTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4[Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4, Te6edf3packetTff7b72.Td2a8ffsnrTb4b4b4]Tb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8fflocal_client_snr_cacheTb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffLOCAL_CLIENT_CACHE_MAXSIZETb4b4b4:
Te6edf3TransportTff7b72.Td2a8fflocal_client_snr_cacheTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_stat_qTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffr_stat_q Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3packetTff7b72.Td2a8ffq Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_stat_q
Te6edf3TransportTff7b72.Td2a8fflocal_client_q_cacheTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4[Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4, Te6edf3packetTff7b72.Td2a8ffqTb4b4b4]Tb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8fflocal_client_q_cacheTb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffLOCAL_CLIENT_CACHE_MAXSIZETb4b4b4:
Te6edf3TransportTff7b72.Td2a8fflocal_client_q_cacheTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffis_local_client_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4: Te6edf3packetTff7b72.Td2a8ffhops Tff7b72-Tff7b72= T79c0ff1
Tff7b72elif Te6edf3TransportTff7b72.Td2a8ffinterface_to_shared_instanceTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4: Te6edf3packetTff7b72.Td2a8ffhops Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffpacket_filterTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
T8b949e# By default, remember packet hashes to avoid routing
T8b949e# loops in the network, using the packet filter.
Te6edf3remember_packet_hash Tff7b72= Tff7b72True
T8b949e# If this packet belongs to a link in our link table,
T8b949e# we'll have to defer adding it to the filter list.
T8b949e# In some cases, we might see a packet over a shared-
T8b949e# medium interface, belonging to a link that transports
T8b949e# or terminates with this instance, but before it would
T8b949e# normally reach us. If the packet is appended to the
T8b949e# filter list at this point, link transport will break.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4: Te6edf3remember_packet_hash Tff7b72= Tff7b72False
T8b949e# If this is a link request proof, don't add it until
T8b949e# we are sure it's not actually somewhere else in the
T8b949e# routing chain.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPROOF Tff7b72and Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffLRPROOFTb4b4b4: Te6edf3remember_packet_hash Tff7b72= Tff7b72False
Tff7b72if Te6edf3remember_packet_hashTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffadd_packet_hashTb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)
T8b949e# TODO: Enable when caching has been redesigned
T8b949e# Transport.cache(packet)
T8b949e# Check special conditions for local clients connected
T8b949e# through a shared Reticulum instance
Te6edf3from_local_client Tff7b72= Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4)
Te6edf3for_local_client Tff7b72= Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4) Tff7b72and Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_table Tff7b72and Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4] Tff7b72== T79c0ff0Tb4b4b4)
Te6edf3local_client_nh Tff7b72= Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4) Tff7b72and Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8fflink_table Tff7b72and Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_LT_NH_IFTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4)
Te6edf3local_client_rh Tff7b72= Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4) Tff7b72and Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8fflink_table Tff7b72and Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4)
Te6edf3proof_for_local_client Tff7b72= Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffreverse_tableTb4b4b4) Tff7b72and Tb4b4b4(Te6edf3TransportTff7b72.Td2a8ffreverse_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_RT_RCVD_IFTb4b4b4] Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4)
Te6edf3to_local_client Tff7b72= Te6edf3for_local_client Tff7b72or Te6edf3proof_for_local_client
Te6edf3instance_local_link Tff7b72= Te6edf3local_client_nh Tff7b72and Te6edf3local_client_rh
Te6edf3for_local_client_link Tff7b72= Te6edf3local_client_nh Tff7b72or Te6edf3local_client_rh
Te6edf3link_request_handled Tff7b72= Tff7b72False
T8b949e# Plain broadcast packets from local clients are sent
T8b949e# directly on all attached interfaces, since they are
T8b949e# never injected into transport.
Tff7b72if Tff7b72not Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffcontrol_hashesTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAIN Tff7b72and Te6edf3packetTff7b72.Td2a8fftransport_type Tff7b72== Te6edf3TransportTff7b72.Td2a8ffBROADCASTTb4b4b4:
T8b949e# Send to all interfaces except the originator
Tff7b72if Te6edf3from_local_clientTb4b4b4:
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Te6edf3interface Tff7b72!= Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4:
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3interfaceTb4b4b4, Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4)
T8b949e# If the packet was not from a local client, send
T8b949e# it directly to all local clients
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4:
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3interfaceTb4b4b4, Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4)
T8b949e# General transport handling. Takes care of directing
T8b949e# packets according to transport tables and recording
T8b949e# entries in reverse and link tables.
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72or Te6edf3from_local_client Tff7b72or Te6edf3for_local_client Tff7b72or Te6edf3for_local_client_linkTb4b4b4:
T8b949e# If there is no transport id, but the packet is
T8b949e# for a local client, we generate the transport
T8b949e# id (it was stripped on the previous hop, since
T8b949e# we "spoof" the hop count for clients behind a
T8b949e# shared instance, so they look directly reach-
T8b949e# able), and reinsert, so the normal transport
T8b949e# implementation can handle the packet.
Tff7b72if Te6edf3packetTff7b72.Td2a8fftransport_id Tff7b72== Tff7b72None Tff7b72and Te6edf3for_local_clientTb4b4b4:
Te6edf3packetTff7b72.Td2a8fftransport_id Tff7b72= Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhash
T8b949e# If this is a cache request, and we can fullfill
T8b949e# it, do so and stop processing. Otherwise resume
T8b949e# normal processing.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffCACHE_REQUESTTb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffcache_request_packetTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4: Tff7b72return
T8b949e# If the packet is in transport, check whether we
T8b949e# are the designated next hop, and process it
T8b949e# accordingly if we are.
Tff7b72if Te6edf3packetTff7b72.Td2a8fftransport_id Tff7b72!= Tff7b72None Tff7b72and Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8fftransport_id Tff7b72== Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3next_hop Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_NEXT_HOPTb4b4b4]
Te6edf3remaining_hops Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4]
Tff7b72if Te6edf3remaining_hops Tff7b72> T79c0ff1Tb4b4b4:
T8b949e# Just increase hop count and transmit
Te6edf3new_raw Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff0Tb4b4b4:T79c0ff1Tb4b4b4]
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3packetTff7b72.Td2a8ffhopsTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3next_hop
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72+T79c0ff2Tb4b4b4:Tb4b4b4]
Tff7b72elif Te6edf3remaining_hops Tff7b72== T79c0ff1Tb4b4b4:
T8b949e# Strip transport headers and transmit
Te6edf3new_flags Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_1Tb4b4b4) Tff7b72<< T79c0ff6 Tff7b72| Tb4b4b4(Te6edf3TransportTff7b72.Td2a8ffBROADCASTTb4b4b4) Tff7b72<< T79c0ff4 Tff7b72| Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffflags Tff7b72& T79c0ff0b00001111Tb4b4b4)
Te6edf3new_raw Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3new_flagsTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3packetTff7b72.Td2a8ffhopsTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72+T79c0ff2Tb4b4b4:Tb4b4b4]
Tff7b72elif Te6edf3remaining_hops Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3to_local_client Tff7b72and Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_hops_delta Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffheader_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_2Tb4b4b4:
T8b949e# Strip transport headers and transmit
Te6edf3new_flags Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_1Tb4b4b4) Tff7b72<< T79c0ff6 Tff7b72| Tb4b4b4(Te6edf3TransportTff7b72.Td2a8ffBROADCASTTb4b4b4) Tff7b72<< T79c0ff4 Tff7b72| Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffflags Tff7b72& T79c0ff0b00001111Tb4b4b4)
Te6edf3new_raw Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3new_flagsTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3packetTff7b72.Td2a8ffhopsTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72+T79c0ff2Tb4b4b4:Tb4b4b4]
Tff7b72elseTb4b4b4:
T8b949e# Just increase hop count and transmit
Te6edf3new_raw Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff0Tb4b4b4:T79c0ff1Tb4b4b4]
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3packetTff7b72.Td2a8ffhopsTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Tff7b72elseTb4b4b4:
T8b949e# Just increase hop count and transmit
Te6edf3new_raw Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff0Tb4b4b4:T79c0ff1Tb4b4b4]
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3packetTff7b72.Td2a8ffhopsTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Te6edf3outbound_interface Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_RVCD_IFTb4b4b4]
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffLINKREQUESTTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3proof_timeout Tff7b72= Te6edf3TransportTff7b72.Td2a8ffextra_link_proof_timeoutTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4)
Te6edf3proof_timeout Tff7b72+Tff7b72= Te6edf3now Tff7b72+ Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffESTABLISHMENT_TIMEOUT_PER_HOP Tff7b72* Tffa657maxTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3remaining_hopsTb4b4b4)
Te6edf3path_mtu Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmtu_from_lr_packetTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3mode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmode_from_lr_packetTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3ph_mtu Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffHW_MTU Tff7b72if Te6edf3interface Tff7b72else Tff7b72None
Te6edf3nh_mtu Tff7b72= Te6edf3outbound_interfaceTff7b72.Td2a8ffHW_MTU
Tff7b72if Te6edf3path_mtuTb4b4b4:
Tff7b72if Te6edf3outbound_interfaceTff7b72.Td2a8ffHW_MTU Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo next-hop HW MTU, disabling link MTU upgradeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3path_mtu Tff7b72= Tff7b72None
Te6edf3new_raw Tff7b72= Te6edf3new_rawTb4b4b4[Tb4b4b4:Tff7b72-Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4]
Tff7b72elif Tff7b72not Te6edf3outbound_interfaceTff7b72.Td2a8ffAUTOCONFIGURE_MTU Tff7b72and Tff7b72not Te6edf3outbound_interfaceTff7b72.Td2a8ffFIXED_MTUTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffOutbound interface doesnTa5d6ff'Ta5d6fft support MTU autoconfiguration, disabling link MTU upgradeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3path_mtu Tff7b72= Tff7b72None
Te6edf3new_raw Tff7b72= Te6edf3new_rawTb4b4b4[Tb4b4b4:Tff7b72-Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3nh_mtu Tff7b72< Te6edf3path_mtu Tff7b72or Tb4b4b4(Te6edf3ph_mtu Tff7b72and Te6edf3ph_mtu Tff7b72< Te6edf3path_mtuTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3path_mtu Tff7b72= Tffa657minTb4b4b4(Te6edf3nh_mtuTb4b4b4, Te6edf3ph_mtuTb4b4b4)
Te6edf3clamped_mtu Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffsignalling_bytesTb4b4b4(Te6edf3path_mtuTb4b4b4, Te6edf3modeTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffClamping link MTU to Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3path_mtuTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3new_raw Tff7b72= Te6edf3new_rawTb4b4b4[Tb4b4b4:Tff7b72-Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4]Tff7b72+Te6edf3clamped_mtu
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDropping link request packet. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return
T8b949e# Entry format is
Te6edf3link_entry Tff7b72= Tb4b4b4[ Te6edf3nowTb4b4b4, T8b949e# 0: Timestamp,
Te6edf3next_hopTb4b4b4, T8b949e# 1: Next-hop transport ID
Te6edf3outbound_interfaceTb4b4b4, T8b949e# 2: Next-hop interface
Te6edf3remaining_hopsTb4b4b4, T8b949e# 3: Remaining hops
Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4, T8b949e# 4: Received on interface
Te6edf3packetTff7b72.Td2a8ffhopsTb4b4b4, T8b949e# 5: Taken hops
Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4, T8b949e# 6: Original destination hash
Tff7b72FalseTb4b4b4, T8b949e# 7: Validated
Te6edf3proof_timeout Tb4b4b4] T8b949e# 8: Proof timeout timestamp
Tff7b72with Te6edf3TransportTff7b72.Td2a8fflink_table_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8fflink_id_from_lr_packetTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4] Tff7b72= Te6edf3link_entry
Te6edf3link_request_handled Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
T8b949e# Entry format is
Te6edf3reverse_entry Tff7b72= Tb4b4b4[ Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4, T8b949e# 0: Received on interface
Te6edf3outbound_interfaceTb4b4b4, T8b949e# 1: Outbound interface
Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tb4b4b4] T8b949e# 2: Timestamp
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffreverse_table_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffreverse_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffgetTruncatedHashTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72= Te6edf3reverse_entry
Tff7b72if Te6edf3TransportTff7b72.Td2a8fflocal_hops_delta Tff7b72!= T79c0ff0 Tff7b72and Te6edf3from_local_client Tff7b72and Tff7b72not Te6edf3to_local_clientTb4b4b4: Te6edf3new_raw Tff7b72= Te6edf3TransportTff7b72.Td2a8ffmangle_hopsTb4b4b4(Te6edf3new_rawTb4b4b4, Te6edf3TransportTff7b72.Td2a8fflocal_hops_deltaTb4b4b4)
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3outbound_interfaceTb4b4b4, Te6edf3new_rawTb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_TIMESTAMPTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# TODO: There should probably be some kind of REJECT
T8b949e# mechanism here, to signal to the source that their
T8b949e# expected path failed.
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffGot packet in transport, but no known path to final destination Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Dropping packet.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
T8b949e# Link transport handling. Directs packets according
T8b949e# to entries in the link tables
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCE Tff7b72and Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffLINKREQUEST Tff7b72and Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffLRPROOFTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4:
Te6edf3link_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
T8b949e# If receiving and outbound interface is
T8b949e# the same for this link, direction doesn't
T8b949e# matter, and we simply repeat the packet.
Te6edf3outbound_interface Tff7b72= Tff7b72None
Tff7b72if Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_NH_IFTb4b4b4] Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]Tb4b4b4:
T8b949e# But check that taken hops matches one
T8b949e# of the expectede values.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_REM_HOPSTb4b4b4] Tff7b72or Te6edf3packetTff7b72.Td2a8ffhops Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_HOPSTb4b4b4]Tb4b4b4:
Te6edf3outbound_interface Tff7b72= Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_NH_IFTb4b4b4]
Tff7b72elseTb4b4b4:
T8b949e# If interfaces differ, we transmit on
T8b949e# the opposite interface of what the
T8b949e# packet was received on.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_NH_IFTb4b4b4]Tb4b4b4:
T8b949e# Also check that expected hop count matches
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_REM_HOPSTb4b4b4]Tb4b4b4:
Te6edf3outbound_interface Tff7b72= Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]
Tff7b72elif Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]Tb4b4b4:
T8b949e# Also check that expected hop count matches
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_HOPSTb4b4b4]Tb4b4b4:
Te6edf3outbound_interface Tff7b72= Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_NH_IFTb4b4b4]
Tff7b72if Te6edf3outbound_interface Tff7b72!= Tff7b72NoneTb4b4b4:
T8b949e# Add this packet to the filter hashlist if we
T8b949e# have determined that it's actually our turn
T8b949e# to process it.
Te6edf3TransportTff7b72.Td2a8ffadd_packet_hashTb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)
Te6edf3new_raw Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff0Tb4b4b4:T79c0ff1Tb4b4b4]
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3packetTff7b72.Td2a8ffhops Tff7b72if Tff7b72not Te6edf3from_local_client Tff7b72or Te6edf3instance_local_link Tff7b72or Te6edf3TransportTff7b72.Td2a8fflocal_hops_delta Tff7b72== T79c0ff0 Tff7b72else Te6edf3TransportTff7b72.Td2a8fflocal_hops_deltaTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3outbound_interfaceTb4b4b4, Te6edf3new_rawTb4b4b4)
Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_LT_TIMESTAMPTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# TODO: Can we return safely here? Test and possibly enable this at some point.
T8b949e# return
T8b949e# Announce handling. Handles logic related to incoming
T8b949e# announces, queueing rebroadcasts of these, and removal
T8b949e# of queued announce rebroadcasts once handed to the next node.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4:
Te6edf3announce_signature_valid Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffvalidate_announceTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3only_validate_signatureTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Tff7b72not Te6edf3announce_signature_validTb4b4b4: Tff7b72return
Tff7b72elif Te6edf3interface Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffreceived_announceTb4b4b4(Tb4b4b4)
Te6edf3announced_destination_known Tff7b72= Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_table
Tff7b72if Tff7b72not Te6edf3announced_destination_knownTb4b4b4:
T8b949e# This is an unknown destination, and we'll apply
T8b949e# potential ingress limiting. Already known
T8b949e# destinations will have re-announces controlled
T8b949e# by normal announce rate limiting.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_requests Tff7b72or Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdiscovery_path_requestsTb4b4b4:
T8b949e# RNS.log(f"Skipping ingress limit check for {RNS.prettyhexrep(packet.destination_hash)} due to waiting path requests", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
Tff7b72pass
Tff7b72elif Te6edf3interfaceTff7b72.Td2a8ffshould_ingress_limitTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3interfaceTff7b72.Td2a8ffhold_announceTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72return
Te6edf3local_destination Tff7b72= Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4:
Te6edf3local_destination Tff7b72= Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Tff7b72if Te6edf3local_destination Tff7b72== Tff7b72None Tff7b72and Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffvalidate_announceTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8fftransport_id Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3received_from Tff7b72= Te6edf3packetTff7b72.Td2a8fftransport_id
T8b949e# Check if this is a next retransmission from
T8b949e# another node. If it is, we're removing the
T8b949e# announce in question from our pending table
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4:
Te6edf3announce_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhopsTff7b72-T79c0ff1 Tff7b72== Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_HOPSTb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHeard a rebroadcast of announce for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff on Tffd700{Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_LCL_RBRDTb4b4b4] Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_RETRIESTb4b4b4] Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_LCL_RBRDTb4b4b4] Tff7b72>Tff7b72= Te6edf3TransportTff7b72.Td2a8ffLOCAL_REBROADCASTS_MAXTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompleted announce processing for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, local rebroadcast limit reachedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_table_lockTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffannounce_tableTff7b72.Td2a8ffpopTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhopsTff7b72-T79c0ff1 Tff7b72== Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_HOPSTb4b4b4]Tff7b72+T79c0ff1 Tff7b72and Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_RETRIESTb4b4b4] Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3now Tff7b72< Te6edf3announce_entryTb4b4b4[Te6edf3IDX_AT_RTRNS_TMOTb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRebroadcasted announce for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff has been passed on to another node, no further tries neededTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_table_lockTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffannounce_tableTff7b72.Td2a8ffpopTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3received_from Tff7b72= Te6edf3packetTff7b72.Td2a8ffdestination_hash
T8b949e# Check if this announce should be inserted into
T8b949e# announce and destination tables
Te6edf3should_add Tff7b72= Tff7b72False
T8b949e# First, check that the announce is not for a destination
T8b949e# local to this system, and that hops are less than the max
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Te6edf3local_and_hops_condition Tff7b72= Tb4b4b4(Te6edf3packetTff7b72.Td2a8ffhops Tff7b72< Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_MTff7b72+T79c0ff1Tb4b4b4) Tff7b72and Tb4b4b4(Tff7b72not Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4)
Tff7b72if Te6edf3local_and_hops_conditionTb4b4b4:
Te6edf3announce_emitted Tff7b72= Te6edf3TransportTff7b72.Td2a8ffannounce_emittedTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3random_blob Tff7b72= Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffNAME_HASH_LENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffNAME_HASH_LENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+T79c0ff10Tb4b4b4]
Te6edf3random_blobs Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffinbound_announce_lockTb4b4b4:
Te6edf3announced_destination_known Tff7b72|Tff7b72= Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_table
Tff7b72if Tff7b72not Te6edf3announced_destination_knownTb4b4b4:
T8b949e# If this destination is unknown in our table
T8b949e# we should add it
Te6edf3should_add Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3random_blobs Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_RANDBLOBSTb4b4b4]
Te6edf3current_gravity Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_RVCD_IFTb4b4b4]Tff7b72.Td2a8ffgravity
Te6edf3announce_gravity Tff7b72= Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffgravity Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72!= Tff7b72None Tff7b72else Tff7b72None
T8b949e# If we already have a path to the announced destination,
T8b949e# but a more recently emitted announce arrives with a hop
T8b949e# count equal to or less than the existing path, we will
T8b949e# update our tables.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72<Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4]Tb4b4b4:
Te6edf3path_timebase Tff7b72= Te6edf3TransportTff7b72.Td2a8fftimebase_from_random_blobsTb4b4b4(Te6edf3random_blobsTb4b4b4)
Tff7b72if Tff7b72not Te6edf3random_blob Tff7b72in Te6edf3random_blobs Tff7b72and Te6edf3announce_emitted Tff7b72> Te6edf3path_timebaseTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffmark_path_unknown_stateTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Te6edf3should_add Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
T8b949e# If the same announce is received later on an interface
T8b949e# with higher gravity, allow updating the path table to
T8b949e# use this interface instead.
Tff7b72if Te6edf3announce_emitted Tff7b72!= Te6edf3path_timebaseTb4b4b4: Te6edf3should_add Tff7b72= Tff7b72False
Tff7b72elif Te6edf3announce_gravity Tff7b72== Tff7b72None Tff7b72or Te6edf3current_gravity Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3should_add Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3announce_gravity Tff7b72<Tff7b72= Te6edf3current_gravityTb4b4b4: Te6edf3should_add Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReplacing path table entry for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff with new announce due to higher gravity (Tffd700{Te6edf3current_gravityTffd700}Ta5d6ff->Tffd700{Te6edf3announce_gravityTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3should_add Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
T8b949e# If an announce arrives with a larger hop
T8b949e# count than we already have in the table,
T8b949e# ignore it, unless the path is expired, or
T8b949e# the emission timestamp is more recent.
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3path_expires Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_EXPIRESTb4b4b4]
Te6edf3path_announce_emitted Tff7b72= T79c0ff0
Tff7b72for Te6edf3path_random_blob Tff7b72in Te6edf3random_blobsTb4b4b4:
Te6edf3path_announce_emitted Tff7b72= Tffa657maxTb4b4b4(Te6edf3path_announce_emittedTb4b4b4, Tffa657intTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3path_random_blobTb4b4b4[T79c0ff5Tb4b4b4:T79c0ff10Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffbigTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path_announce_emitted Tff7b72>Tff7b72= Te6edf3announce_emittedTb4b4b4: Tff7b72break
T8b949e# If the path has expired, consider this
T8b949e# announce for adding to the path table.
Tff7b72if Tb4b4b4(Te6edf3now Tff7b72>Tff7b72= Te6edf3path_expiresTb4b4b4)Tb4b4b4:
T8b949e# We check that the announce is
T8b949e# different from ones we've already heard,
T8b949e# to avoid loops in the network
Tff7b72if Tff7b72not Te6edf3random_blob Tff7b72in Te6edf3random_blobsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReplacing path table entry for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with new announce due to expired pathTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3TransportTff7b72.Td2a8ffmark_path_unknown_stateTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Te6edf3should_add Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4: Te6edf3should_add Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
T8b949e# If the path is not expired, but the emission
T8b949e# is more recent, and we haven't already heard
T8b949e# this announce before, update the path table.
Tff7b72if Tb4b4b4(Te6edf3announce_emitted Tff7b72> Te6edf3path_announce_emittedTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3random_blob Tff7b72in Te6edf3random_blobsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReplacing path table entry for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with new announce, since it was more recently emittedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3TransportTff7b72.Td2a8ffmark_path_unknown_stateTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Te6edf3should_add Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4: Te6edf3should_add Tff7b72= Tff7b72False
T8b949e# If we have already heard this announce before,
T8b949e# but the path has been marked as unresponsive
T8b949e# by a failed communications attempt or similar,
T8b949e# allow updating the path table to this one.
Tff7b72elif Te6edf3announce_emitted Tff7b72== Te6edf3path_announce_emittedTb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffpath_is_unresponsiveTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReplacing path table entry for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with new announce, since previously tried path was unresponsiveTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3should_add Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4: Te6edf3should_add Tff7b72= Tff7b72False
Tff7b72if Te6edf3should_addTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3is_from_local_client Tff7b72= Te6edf3TransportTff7b72.Td2a8fffrom_local_clientTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3rate_blocked Tff7b72= Tff7b72False
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPATH_RESPONSE Tff7b72and Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffannounce_rate_target Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_rate_table_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffannounce_rate_tableTb4b4b4:
Te6edf3rate_entry Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4: Te6edf3nowTb4b4b4, Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffblocked_untilTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4: Tb4b4b4[Te6edf3nowTb4b4b4]Tb4b4b4}
Te6edf3TransportTff7b72.Td2a8ffannounce_rate_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Te6edf3rate_entry
Tff7b72elseTb4b4b4:
Te6edf3rate_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffannounce_rate_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3nowTb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72> Te6edf3TransportTff7b72.Td2a8ffMAX_RATE_TIMESTAMPSTb4b4b4:
Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3current_rate Tff7b72= Te6edf3now Tff7b72- Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3now Tff7b72> Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6ffblocked_untilTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3current_rate Tff7b72< Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffannounce_rate_targetTb4b4b4: Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4] Tff7b72+Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4: Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4] Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4]Tff7b72-T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4] Tff7b72> Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffannounce_rate_graceTb4b4b4:
Te6edf3rate_target Tff7b72= Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffannounce_rate_target
Te6edf3rate_penalty Tff7b72= Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffannounce_rate_penalty
Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6ffblocked_untilTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4] Tff7b72+ Te6edf3rate_target Tff7b72+ Te6edf3rate_penalty
Te6edf3rate_blocked Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3rate_entryTb4b4b4[Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3now
Tff7b72elseTb4b4b4: Te6edf3rate_blocked Tff7b72= Tff7b72True
Te6edf3retries Tff7b72= T79c0ff0
Te6edf3announce_hops Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Te6edf3local_rebroadcasts Tff7b72= T79c0ff0
Te6edf3block_rebroadcasts Tff7b72= Tff7b72False
Te6edf3attached_interface Tff7b72= Tff7b72None
Te6edf3retransmit_timeout Tff7b72= Te6edf3now Tff7b72+ Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffrandTb4b4b4(Tb4b4b4) Tff7b72* Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_RWTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ACCESS_POINTTb4b4b4:
Te6edf3expires Tff7b72= Te6edf3now Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffAP_PATH_TIME
Tff7b72elif Tffa657hasattrTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMINGTb4b4b4:
Te6edf3expires Tff7b72= Te6edf3now Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffROAMING_PATH_TIME
Tff7b72elseTb4b4b4:
Te6edf3expires Tff7b72= Te6edf3now Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_E
Tff7b72if Tff7b72not Te6edf3random_blob Tff7b72in Te6edf3random_blobsTb4b4b4:
Te6edf3random_blobsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3random_blobTb4b4b4)
Te6edf3random_blobs Tff7b72= Te6edf3random_blobsTb4b4b4[Tff7b72-Te6edf3TransportTff7b72.Td2a8ffMAX_RANDOM_BLOBSTb4b4b4:Tb4b4b4]
Tff7b72if Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72or Te6edf3is_from_local_clientTb4b4b4) Tff7b72and Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPATH_RESPONSETb4b4b4:
T8b949e# Insert announce into announce table for retransmission
Tff7b72if Te6edf3rate_blockedTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking rebroadcast of announce from Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff due to excessive announce rateTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3is_from_local_clientTb4b4b4:
T8b949e# If the announce is from a local client,
T8b949e# it is announced immediately, but only one time.
Te6edf3retransmit_timeout Tff7b72= Te6edf3now
Te6edf3retries Tff7b72= Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_R
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_table_lockTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Tb4b4b4[
Te6edf3nowTb4b4b4, T8b949e# 0: IDX_AT_TIMESTAMP
Te6edf3retransmit_timeoutTb4b4b4, T8b949e# 1: IDX_AT_RTRNS_TMO
Te6edf3retriesTb4b4b4, T8b949e# 2: IDX_AT_RETRIES
Te6edf3received_fromTb4b4b4, T8b949e# 3: IDX_AT_RCVD_IF
Te6edf3announce_hopsTb4b4b4, T8b949e# 4: IDX_AT_HOPS
Te6edf3packetTb4b4b4, T8b949e# 5: IDX_AT_PACKET
Te6edf3local_rebroadcastsTb4b4b4, T8b949e# 6: IDX_AT_LCL_RBRD
Te6edf3block_rebroadcastsTb4b4b4, T8b949e# 7: IDX_AT_BLCK_RBRD
Te6edf3attached_interfaceTb4b4b4, T8b949e# 8: IDX_AT_ATTCHD_IF
Tb4b4b4]
Tff7b72elif Te6edf3is_from_local_client Tff7b72and Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPATH_RESPONSETb4b4b4:
T8b949e# If this is a path response from a local client,
T8b949e# check if any external interfaces have pending
T8b949e# path requests.
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpending_local_prs_lockTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpending_local_path_requestsTb4b4b4:
Te6edf3desiring_interface Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpending_local_path_requestsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Te6edf3retransmit_timeout Tff7b72= Te6edf3now
Te6edf3retries Tff7b72= Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_R
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_table_lockTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Tb4b4b4[
Te6edf3nowTb4b4b4,
Te6edf3retransmit_timeoutTb4b4b4,
Te6edf3retriesTb4b4b4,
Te6edf3received_fromTb4b4b4,
Te6edf3announce_hopsTb4b4b4,
Te6edf3packetTb4b4b4,
Te6edf3local_rebroadcastsTb4b4b4,
Te6edf3block_rebroadcastsTb4b4b4,
Te6edf3attached_interface
Tb4b4b4]
T8b949e# If we have any local clients connected, we re-
T8b949e# transmit the announce to them immediately
Tff7b72if Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3announce_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3announce_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3announce_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3announce_destinationTff7b72.Td2a8ffhash Tff7b72= Te6edf3packetTff7b72.Td2a8ffdestination_hash
Te6edf3announce_destinationTff7b72.Td2a8ffhexhash Tff7b72= Te6edf3announce_destinationTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3announce_context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffNONE
Te6edf3announce_data Tff7b72= Te6edf3packetTff7b72.Td2a8ffdata
T8b949e# TODO: Shouldn't the context be PATH_RESPONSE in the first case here?
Tff7b72if Te6edf3is_from_local_client Tff7b72and Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPATH_RESPONSETb4b4b4:
Tff7b72for Te6edf3local_interface Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72!= Te6edf3local_interfaceTb4b4b4:
Te6edf3new_announce Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3announce_destinationTb4b4b4, Te6edf3announce_dataTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4, T8b949e# <-- This one?
Te6edf3context Tff7b72= Te6edf3announce_contextTb4b4b4, Te6edf3header_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_2Tb4b4b4,
Te6edf3transport_type Tff7b72= Te6edf3TransportTff7b72.Td2a8ffTRANSPORTTb4b4b4, Te6edf3transport_id Tff7b72= Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3attached_interface Tff7b72= Te6edf3local_interfaceTb4b4b4, Te6edf3context_flag Tff7b72= Te6edf3packetTff7b72.Td2a8ffcontext_flagTb4b4b4)
Te6edf3new_announceTff7b72.Td2a8ffhops Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Te6edf3new_announceTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3local_interface Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72!= Te6edf3local_interfaceTb4b4b4:
Te6edf3new_announce Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3announce_destinationTb4b4b4, Te6edf3announce_dataTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4,
Te6edf3context Tff7b72= Te6edf3announce_contextTb4b4b4, Te6edf3header_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_2Tb4b4b4,
Te6edf3transport_type Tff7b72= Te6edf3TransportTff7b72.Td2a8ffTRANSPORTTb4b4b4, Te6edf3transport_id Tff7b72= Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3attached_interface Tff7b72= Te6edf3local_interfaceTb4b4b4, Te6edf3context_flag Tff7b72= Te6edf3packetTff7b72.Td2a8ffcontext_flagTb4b4b4)
Te6edf3new_announceTff7b72.Td2a8ffhops Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Te6edf3new_announceTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
T8b949e# If we have any waiting discovery path requests
T8b949e# for this destination, we retransmit to that
T8b949e# interface immediately
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdiscovery_path_requestsTb4b4b4:
Te6edf3pr_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffdiscovery_path_requestsTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Te6edf3attached_interface Tff7b72= Te6edf3pr_entryTb4b4b4[Ta5d6ff"Ta5d6ffrequesting_interfaceTa5d6ff"Tb4b4b4]
Te6edf3interface_str Tff7b72= Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3attached_interfaceTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffGot matching announce, answering waiting discovery path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Te6edf3interface_strTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3announce_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4, Te6edf3_no_useTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3announce_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3announce_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3announce_destinationTff7b72.Td2a8ffhash Tff7b72= Te6edf3packetTff7b72.Td2a8ffdestination_hash
Te6edf3announce_destinationTff7b72.Td2a8ffhexhash Tff7b72= Te6edf3announce_destinationTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3announce_context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffNONE
Te6edf3announce_data Tff7b72= Te6edf3packetTff7b72.Td2a8ffdata
Te6edf3new_announce Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3announce_destinationTb4b4b4, Te6edf3announce_dataTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4,
Te6edf3context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPATH_RESPONSETb4b4b4, Te6edf3header_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_2Tb4b4b4,
Te6edf3transport_type Tff7b72= Te6edf3TransportTff7b72.Td2a8ffTRANSPORTTb4b4b4, Te6edf3transport_id Tff7b72= Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3attached_interface Tff7b72= Te6edf3attached_interfaceTb4b4b4, Te6edf3context_flag Tff7b72= Te6edf3packetTff7b72.Td2a8ffcontext_flagTb4b4b4)
Te6edf3new_announceTff7b72.Td2a8ffhops Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Te6edf3new_announceTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffcacheTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3force_cacheTff7b72=Tff7b72TrueTb4b4b4, Te6edf3packet_typeTff7b72=Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4)
Te6edf3path_table_entry Tff7b72= Tb4b4b4[Te6edf3nowTb4b4b4, Te6edf3received_fromTb4b4b4, Te6edf3announce_hopsTb4b4b4, Te6edf3expiresTb4b4b4, Te6edf3random_blobsTb4b4b4, Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4, Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Te6edf3path_table_entry
Te6edf3TransportTff7b72.Td2a8ffmark_path_unknown_stateTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDestination Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is now Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3announce_hopsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hops away via Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3received_fromTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_requestsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_used_destination_dataTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
T8b949e# If the receiving interface is a tunnel, we add the
T8b949e# announce to the tunnels table
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4, Ta5d6ff"Ta5d6fftunnel_idTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8fftunnel_id Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8fftunnels_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8fftunnel_id Tff7b72in Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTunnel ID for Tffd700{Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTffd700}Ta5d6ff was not found in tunnel tableTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3tunnel_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4[Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8fftunnel_idTb4b4b4]
Te6edf3paths Tff7b72= Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_PATHSTb4b4b4]
Te6edf3pathsTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Tb4b4b4[Te6edf3nowTb4b4b4, Te6edf3received_fromTb4b4b4, Te6edf3announce_hopsTb4b4b4, Te6edf3expiresTb4b4b4, Te6edf3random_blobsTb4b4b4, Tff7b72NoneTb4b4b4, Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4]
Te6edf3expires Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffTUNNEL_TIMEOUT
Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_EXPIRESTb4b4b4] Tff7b72= Te6edf3expires
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff associated with tunnel Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8fftunnel_idTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
T8b949e# Call externally registered callbacks from apps
T8b949e# wanting to know when an announce arrives
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_handler_lockTb4b4b4:
Tff7b72for Te6edf3handler Tff7b72in Te6edf3TransportTff7b72.Td2a8ffannounce_handlersTb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# Check that the announced destination matches
T8b949e# the handlers aspect filter
Te6edf3execute_callback Tff7b72= Tff7b72False
Te6edf3announce_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)
T8b949e# If the handlers aspect filter is set to
T8b949e# None, we execute the callback in all cases
Tff7b72if Te6edf3handlerTff7b72.Td2a8ffaspect_filter Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3execute_callback Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3handler_expected_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffaspect_filterTb4b4b4, Te6edf3announce_identityTb4b4b4)
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72== Te6edf3handler_expected_hashTb4b4b4: Te6edf3execute_callback Tff7b72= Tff7b72True
T8b949e# If this is a path response, check whether the
T8b949e# handler wants to receive it.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPATH_RESPONSETb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3handlerTb4b4b4, Ta5d6ff"Ta5d6ffreceive_path_responsesTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3handlerTff7b72.Td2a8ffreceive_path_responses Tff7b72== Tff7b72TrueTb4b4b4: Tff7b72pass
Tff7b72elseTb4b4b4: Te6edf3execute_callback Tff7b72= Tff7b72False
Tff7b72if Te6edf3execute_callbackTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3inspectTff7b72.Td2a8ffsignatureTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffreceived_announceTb4b4b4)Tff7b72.Td2a8ffparametersTb4b4b4) Tff7b72== T79c0ff3Tb4b4b4:
Tff7b72def Td2a8ffjobTb4b4b4(Te6edf3handlerTff7b72=Te6edf3handlerTb4b4b4, Te6edf3packetTff7b72=Te6edf3packetTb4b4b4, Te6edf3announce_identityTff7b72=Te6edf3announce_identityTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffreceived_announceTb4b4b4(Te6edf3destination_hashTff7b72=Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4,
Te6edf3announced_identityTff7b72=Te6edf3announce_identityTb4b4b4,
Te6edf3app_dataTff7b72=Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecall_app_dataTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72elif Tffa657lenTb4b4b4(Te6edf3inspectTff7b72.Td2a8ffsignatureTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffreceived_announceTb4b4b4)Tff7b72.Td2a8ffparametersTb4b4b4) Tff7b72== T79c0ff4Tb4b4b4:
Tff7b72def Td2a8ffjobTb4b4b4(Te6edf3handlerTff7b72=Te6edf3handlerTb4b4b4, Te6edf3packetTff7b72=Te6edf3packetTb4b4b4, Te6edf3announce_identityTff7b72=Te6edf3announce_identityTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffreceived_announceTb4b4b4(Te6edf3destination_hashTff7b72=Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4,
Te6edf3announced_identityTff7b72=Te6edf3announce_identityTb4b4b4,
Te6edf3app_dataTff7b72=Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecall_app_dataTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3announce_packet_hash Tff7b72= Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72elif Tffa657lenTb4b4b4(Te6edf3inspectTff7b72.Td2a8ffsignatureTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffreceived_announceTb4b4b4)Tff7b72.Td2a8ffparametersTb4b4b4) Tff7b72== T79c0ff5Tb4b4b4:
Tff7b72def Td2a8ffjobTb4b4b4(Te6edf3handlerTff7b72=Te6edf3handlerTb4b4b4, Te6edf3packetTff7b72=Te6edf3packetTb4b4b4, Te6edf3announce_identityTff7b72=Te6edf3announce_identityTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffreceived_announceTb4b4b4(Te6edf3destination_hashTff7b72=Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4,
Te6edf3announced_identityTff7b72=Te6edf3announce_identityTb4b4b4,
Te6edf3app_dataTff7b72=Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecall_app_dataTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3announce_packet_hash Tff7b72= Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4,
Te6edf3is_path_response Tff7b72= Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPATH_RESPONSETb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid signature for announce handler callbackTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while processing external announce callback.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
T8b949e# Handling for link requests to local destinations
Tff7b72elif Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffLINKREQUEST Tff7b72and Tff7b72not Te6edf3link_request_handledTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8fftransport_id Tff7b72== Tff7b72None Tff7b72or Te6edf3packetTff7b72.Td2a8fftransport_id Tff7b72== Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4:
Te6edf3destination Tff7b72= Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4:
Te6edf3destination Tff7b72= Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Tff7b72if Te6edf3destination Tff7b72and Te6edf3destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3packetTff7b72.Td2a8ffdestination_typeTb4b4b4:
Te6edf3path_mtu Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmtu_from_lr_packetTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3mode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmode_from_lr_packetTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffAUTOCONFIGURE_MTU Tff7b72or Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffFIXED_MTUTb4b4b4:
Te6edf3nh_mtu Tff7b72= Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffHW_MTU
Tff7b72elseTb4b4b4:
Te6edf3nh_mtu Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTU
Tff7b72if Te6edf3path_mtuTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffHW_MTU Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3path_mtu Tff7b72= Tff7b72None
Te6edf3packetTff7b72.Td2a8ffdata Tff7b72= Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4[Tb4b4b4:Tff7b72-Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3nh_mtu Tff7b72< Te6edf3path_mtuTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3path_mtu Tff7b72= Te6edf3nh_mtu
Te6edf3clamped_mtu Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffsignalling_bytesTb4b4b4(Te6edf3path_mtuTb4b4b4, Te6edf3modeTb4b4b4)
Te6edf3packetTff7b72.Td2a8ffdata Tff7b72= Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4[Tb4b4b4:Tff7b72-Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4]Tff7b72+Te6edf3clamped_mtu
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDropping link request packet to local destination. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return
Te6edf3packetTff7b72.Td2a8ffdestination Tff7b72= Te6edf3destination
Te6edf3destinationTff7b72.Td2a8ffreceiveTb4b4b4(Te6edf3packetTb4b4b4)
T8b949e# Handling for local data packets
Tff7b72elif Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffDATATb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffLINKTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffactive_links_lockTb4b4b4:
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffactive_linksTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8fflink_id Tff7b72== Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8ffattached_interface Tff7b72== Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4:
Te6edf3packetTff7b72.Td2a8fflink Tff7b72= Te6edf3link
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffCACHE_REQUESTTb4b4b4:
Te6edf3cached_packet Tff7b72= Te6edf3TransportTff7b72.Td2a8ffget_cached_packetTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4)
Tff7b72if Te6edf3cached_packet Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3cached_packetTff7b72.Td2a8ffunpackTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3destinationTff7b72=Te6edf3linkTb4b4b4, Te6edf3dataTff7b72=Te6edf3cached_packetTff7b72.Td2a8ffdataTb4b4b4,
Te6edf3packet_typeTff7b72=Te6edf3cached_packetTff7b72.Td2a8ffpacket_typeTb4b4b4, Te6edf3contextTff7b72=Te6edf3cached_packetTff7b72.Td2a8ffcontextTb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3linkTff7b72.Td2a8ffreceiveTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72break
Tff7b72elseTb4b4b4:
T8b949e# In the strange and rare case that an interface
T8b949e# is partly malfunctioning, and a link-associated
T8b949e# packet is being received on an interface that
T8b949e# has failed sending, and transport has failed over
T8b949e# to another path, we remove this packet hash from
T8b949e# the filter hashlist so the link can receive the
T8b949e# packet when it finally arrives over another path.
Tff7b72while Te6edf3packetTff7b72.Td2a8ffpacket_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpacket_hashlistTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpacket_hashlistTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3destination Tff7b72= Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4:
Te6edf3destination Tff7b72= Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Tff7b72if Te6edf3destination Tff7b72and Te6edf3destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3packetTff7b72.Td2a8ffdestination_typeTb4b4b4:
Te6edf3packetTff7b72.Td2a8ffdestination Tff7b72= Te6edf3destination
Tff7b72if Te6edf3destinationTff7b72.Td2a8ffreceiveTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3destinationTff7b72.Td2a8ffproof_strategy Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPROVE_ALLTb4b4b4: Te6edf3packetTff7b72.Td2a8ffproveTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3destinationTff7b72.Td2a8ffproof_strategy Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPROVE_APPTb4b4b4:
Tff7b72if Te6edf3destinationTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffproof_requestedTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3destinationTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffproof_requestedTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4: Te6edf3packetTff7b72.Td2a8ffproveTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing proof request callback. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
T8b949e# Handling for proofs and link-request proofs
Tff7b72elif Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPROOFTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffLRPROOFTb4b4b4:
T8b949e# This is a link request proof, check if it needs to be transported
Te6edf3REBALANCE_LOGLEVEL Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUG
Tff7b72if Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72or Te6edf3for_local_client_link Tff7b72or Te6edf3from_local_clientTb4b4b4) Tff7b72and Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4:
Te6edf3link_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72!= Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_REM_HOPSTb4b4b4] Tff7b72and Te6edf3TransportTff7b72.Td2a8ffALLOW_LINK_PATH_REBALANCETb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_NH_IFTb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2 Tff7b72or Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4:
Te6edf3signalling_bytes Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72if Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4:
Te6edf3signalling_bytes Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffsignalling_bytesTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmtu_from_lp_packetTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmode_from_lp_packetTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4)
Te6edf3peer_pub_bytes Tff7b72= Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tb4b4b4]
Te6edf3peer_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3peer_sig_pub_bytes Tff7b72= Te6edf3peer_identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4[Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETb4b4b4]
Te6edf3signed_data Tff7b72= Te6edf3packetTff7b72.Td2a8ffdestination_hashTff7b72+Te6edf3peer_pub_bytesTff7b72+Te6edf3peer_sig_pub_bytesTff7b72+Te6edf3signalling_bytes
Te6edf3signature Tff7b72= Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4[Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4]
Te6edf3link_destination Tff7b72= Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]
Tff7b72if Te6edf3peer_identityTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3signed_dataTb4b4b4) Tff7b72and Tff7b72not Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_VALIDATEDTb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRe-balancing path to Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3link_destinationTb4b4b4)Tffd700}Ta5d6ff from link-request proof (Tffd700{Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_REM_HOPSTb4b4b4]Tffd700}Ta5d6ff->Tffd700{Te6edf3packetTff7b72.Td2a8ffhopsTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72else Tff7b72None
Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_REM_HOPSTb4b4b4] Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Te6edf3link_destination Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3path_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3link_destinationTb4b4b4]
Te6edf3path_entryTb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4] Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Tff7b72elif Tff7b72not Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_VALIDATEDTb4b4b4]Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAborting link request proof path re-balancing for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3link_destinationTb4b4b4)Tffd700}Ta5d6ff on link Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff due to invalid signatureTa5d6ff"Tb4b4b4, Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Tff7b72pass
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while re-balancing path from link request proof. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4) Tff7b72else Tff7b72None T8b949e# TODO: Drop to DEBUG at some point
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_REM_HOPSTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72== Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_NH_IFTb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2 Tff7b72or Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4:
Te6edf3signalling_bytes Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72if Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4:
Te6edf3signalling_bytes Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffsignalling_bytesTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmtu_from_lp_packetTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmode_from_lp_packetTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4)
Te6edf3peer_pub_bytes Tff7b72= Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tb4b4b4]
Te6edf3peer_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3peer_sig_pub_bytes Tff7b72= Te6edf3peer_identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4[Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETb4b4b4]
Te6edf3signed_data Tff7b72= Te6edf3packetTff7b72.Td2a8ffdestination_hashTff7b72+Te6edf3peer_pub_bytesTff7b72+Te6edf3peer_sig_pub_bytesTff7b72+Te6edf3signalling_bytes
Te6edf3signature Tff7b72= Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4[Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4]
Tff7b72if Te6edf3peer_identityTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3signed_dataTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLink request proof validated for transport via Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3new_raw Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff0Tb4b4b4:T79c0ff1Tb4b4b4]
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3packetTff7b72.Td2a8ffhops Tff7b72if Tff7b72not Te6edf3from_local_client Tff7b72or Te6edf3instance_local_link Tff7b72or Te6edf3TransportTff7b72.Td2a8fflocal_hops_delta Tff7b72== T79c0ff0 Tff7b72else Te6edf3TransportTff7b72.Td2a8fflocal_hops_deltaTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Te6edf3TransportTff7b72.Td2a8fflink_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_LT_VALIDATEDTb4b4b4] Tff7b72= Tff7b72True
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]Tb4b4b4, Te6edf3new_rawTb4b4b4)
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ff_used_destination_dataTb4b4b4(Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_DSTHASHTb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInvalid link request proof in transport for link Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, dropping proof.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not transport link request proof. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLink request proof received on wrong interface, not transporting it.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReceived link request proof with hop mismatch (Tffd700{Te6edf3packetTff7b72.Td2a8ffhopsTffd700}Ta5d6ff/Tffd700{Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_REM_HOPSTb4b4b4]Tffd700}Ta5d6ff:Tffd700{Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_NH_IFTb4b4b4]Tffd700}Ta5d6ff->Tffd700{Te6edf3link_entryTb4b4b4[Te6edf3IDX_LT_RCVD_IFTb4b4b4]Tffd700}Ta5d6ff), not transporting itTa5d6ff"Tb4b4b4, Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
T8b949e# Check if we can deliver it to a local pending link
Te6edf3pending_link Tff7b72= Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpending_links_lockTb4b4b4:
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpending_linksTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8fflink_id Tff7b72== Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72!= Te6edf3linkTff7b72.Td2a8ffexpected_hops Tff7b72and Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffPENDING Tff7b72and Te6edf3TransportTff7b72.Td2a8ffALLOW_LINK_PATH_REBALANCETb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUnbalanced link path (Tffd700{Te6edf3packetTff7b72.Td2a8ffhopsTffd700}Ta5d6ff/Tffd700{Te6edf3linkTff7b72.Td2a8ffexpected_hopsTffd700}Ta5d6ff) detected on link Tffd700{Te6edf3linkTffd700}Ta5d6ff, validating signature for re-balancing...Ta5d6ff"Tb4b4b4, Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72else Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2 Tff7b72or Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4:
Te6edf3packet_data Tff7b72= Te6edf3packetTff7b72.Td2a8ffdata
Te6edf3signalling_bytes Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3confirmed_mtu Tff7b72= Tff7b72None
Te6edf3mode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmode_from_lp_packetTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72if Te6edf3mode Tff7b72!= Te6edf3linkTff7b72.Td2a8ffmodeTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid link mode Tffd700{Te6edf3modeTffd700}Ta5d6ff in link request proofTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3packet_dataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffLINK_MTU_SIZETb4b4b4:
Te6edf3confirmed_mtu Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffmtu_from_lp_packetTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3signalling_bytes Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffsignalling_bytesTb4b4b4(Te6edf3confirmed_mtuTb4b4b4, Te6edf3modeTb4b4b4)
Te6edf3packet_data Tff7b72= Te6edf3packet_dataTb4b4b4[Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tb4b4b4]
Te6edf3peer_pub_bytes Tff7b72= Te6edf3packet_dataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tb4b4b4]
Te6edf3peer_sig_pub_bytes Tff7b72= Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffidentityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4[Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETff7b72/Tff7b72/T79c0ff2Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffECPUBSIZETb4b4b4]
Te6edf3signed_data Tff7b72= Te6edf3linkTff7b72.Td2a8fflink_idTff7b72+Te6edf3peer_pub_bytesTff7b72+Te6edf3peer_sig_pub_bytesTff7b72+Te6edf3signalling_bytes
Te6edf3signature Tff7b72= Te6edf3packet_dataTb4b4b4[Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4]
Tff7b72if Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffidentityTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3signed_dataTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3linkTff7b72.Td2a8ffrebalancedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRe-balancing path to Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff at link terminus (Tffd700{Te6edf3linkTff7b72.Td2a8ffexpected_hopsTffd700}Ta5d6ff->Tffd700{Te6edf3packetTff7b72.Td2a8ffhopsTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72else Tff7b72None
Te6edf3linkTff7b72.Td2a8ffrebalanced Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffexpected_hops Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Tff7b72if Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3path_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4]
Te6edf3path_entryTb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4] Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPath table re-balanced for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAborting path re-balancing at link terminus for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff on link Tffd700{Te6edf3linkTffd700}Ta5d6ff due to invalid signatureTa5d6ff"Tb4b4b4, Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72else Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while validating link request proof for path re-balancing at link terminus. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3REBALANCE_LOGLEVELTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3packetTff7b72.Td2a8ffhops Tff7b72== Te6edf3linkTff7b72.Td2a8ffexpected_hopsTb4b4b4:
T8b949e# Add this packet to the filter hashlist if we
T8b949e# have determined that it's actually destined
T8b949e# for this system, and then validate the proof
Te6edf3TransportTff7b72.Td2a8ffadd_packet_hashTb4b4b4(Te6edf3packetTff7b72.Td2a8ffpacket_hashTb4b4b4)
Te6edf3pending_link Tff7b72= Te6edf3link
Tff7b72break
Tff7b72if Te6edf3pending_linkTb4b4b4: Te6edf3pending_linkTff7b72.Td2a8ffvalidate_proofTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72elif Te6edf3packetTff7b72.Td2a8ffcontext Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_PRFTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffactive_links_lockTb4b4b4:
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffactive_linksTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8fflink_id Tff7b72== Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4:
Te6edf3linkTff7b72.Td2a8ffreceiveTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72break
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffLINKTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffactive_links_lockTb4b4b4:
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffactive_linksTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8fflink_id Tff7b72== Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4:
Te6edf3packetTff7b72.Td2a8fflink Tff7b72= Te6edf3link
Tff7b72break
Tff7b72if Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketReceiptTff7b72.Td2a8ffEXPL_LENGTHTb4b4b4: Te6edf3proof_hash Tff7b72= Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4[Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3proof_hash Tff7b72= Tff7b72None
T8b949e# Check if this proof needs to be transported
Tff7b72if Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72or Te6edf3from_local_client Tff7b72or Te6edf3proof_for_local_clientTb4b4b4) Tff7b72and Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffreverse_tableTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffreverse_table_lockTb4b4b4: Te6edf3reverse_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffreverse_tableTff7b72.Td2a8ffpopTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72== Te6edf3reverse_entryTb4b4b4[Te6edf3IDX_RT_OUTB_IFTb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffProof received on correct interface, transporting it via Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3reverse_entryTb4b4b4[Te6edf3IDX_RT_RCVD_IFTb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3new_raw Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff0Tb4b4b4:T79c0ff1Tb4b4b4]
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!BTa5d6ff"Tb4b4b4, Te6edf3packetTff7b72.Td2a8ffhops Tff7b72if Tff7b72not Te6edf3from_local_client Tff7b72or Te6edf3proof_for_local_client Tff7b72or Te6edf3TransportTff7b72.Td2a8fflocal_hops_delta Tff7b72== T79c0ff0 Tff7b72else Te6edf3TransportTff7b72.Td2a8fflocal_hops_deltaTb4b4b4)
Te6edf3new_raw Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Te6edf3TransportTff7b72.Td2a8fftransmitTb4b4b4(Te6edf3reverse_entryTb4b4b4[Te6edf3IDX_RT_RCVD_IFTb4b4b4]Tb4b4b4, Te6edf3new_rawTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffProof received on wrong interface, not transporting it.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffreceipts_lockTb4b4b4:
Tff7b72for Te6edf3receipt Tff7b72in Te6edf3TransportTff7b72.Td2a8ffreceiptsTb4b4b4:
Te6edf3receipt_validated Tff7b72= Tff7b72False
Tff7b72if Te6edf3proof_hash Tff7b72!= Tff7b72NoneTb4b4b4:
T8b949e# Only test validation if hash matches
Tff7b72if Te6edf3receiptTff7b72.Td2a8ffhash Tff7b72== Te6edf3proof_hashTb4b4b4:
Te6edf3receipt_validated Tff7b72= Te6edf3receiptTff7b72.Td2a8ffvalidate_proof_packetTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# In case of an implicit proof, we have
T8b949e# to check every single outstanding receipt
Te6edf3receipt_validated Tff7b72= Te6edf3receiptTff7b72.Td2a8ffvalidate_proof_packetTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72if Te6edf3receipt_validatedTb4b4b4:
Tff7b72if Te6edf3receipt Tff7b72in Te6edf3TransportTff7b72.Td2a8ffreceiptsTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffreceiptsTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3receiptTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffsynthesize_tunnelTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3interface_hash Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffget_hashTb4b4b4(Tb4b4b4)
Te6edf3public_key Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)
Te6edf3random_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffget_random_hashTb4b4b4(Tb4b4b4)
Te6edf3tunnel_id_data Tff7b72= Te6edf3public_keyTff7b72+Te6edf3interface_hash
Te6edf3tunnel_id Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3tunnel_id_dataTb4b4b4)
Te6edf3signed_data Tff7b72= Te6edf3tunnel_id_dataTff7b72+Te6edf3random_hash
Te6edf3signature Tff7b72= Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3signed_dataTb4b4b4)
Te6edf3data Tff7b72= Te6edf3signed_dataTff7b72+Te6edf3signature
Te6edf3tnl_snth_dst Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAINTb4b4b4, Te6edf3TransportTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6fftunnelTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsynthesizeTa5d6ff"Tb4b4b4)
Te6edf3packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3tnl_snth_dstTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3packet_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffDATATb4b4b4, Te6edf3transport_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffBROADCASTTb4b4b4, Te6edf3header_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_1Tb4b4b4, Te6edf3attached_interface Tff7b72= Te6edf3interfaceTb4b4b4)
Te6edf3packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffwants_tunnel Tff7b72= Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not synthesize tunnel for Tffd700{Te6edf3interfaceTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8fftunnel_synthesize_handlerTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3expected_length Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72== Te6edf3expected_lengthTb4b4b4:
Te6edf3public_key Tff7b72= Te6edf3dataTb4b4b4[Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tb4b4b4]
Te6edf3interface_hash Tff7b72= Te6edf3dataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4]
Te6edf3tunnel_id_data Tff7b72= Te6edf3public_keyTff7b72+Te6edf3interface_hash
Te6edf3tunnel_id Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3tunnel_id_dataTb4b4b4)
Te6edf3random_hash Tff7b72= Te6edf3dataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4]
Te6edf3signature Tff7b72= Te6edf3dataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Te6edf3expected_lengthTb4b4b4]
Te6edf3signed_data Tff7b72= Te6edf3tunnel_id_dataTff7b72+Te6edf3random_hash
Te6edf3remote_transport_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3remote_transport_identityTff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3public_keyTb4b4b4)
Tff7b72if Te6edf3remote_transport_identityTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3signed_dataTb4b4b4)Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffhandle_tunnelTb4b4b4(Te6edf3tunnel_idTb4b4b4, Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while validating tunnel establishment packet.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffvoid_tunnel_interfaceTb4b4b4(Te6edf3tunnel_idTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8fftunnels_lockTb4b4b4:
Tff7b72if Te6edf3tunnel_id Tff7b72in Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffVoiding tunnel interface Tffd700{Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4[Te6edf3tunnel_idTb4b4b4]Tb4b4b4[Te6edf3IDX_TT_IFTb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4[Te6edf3tunnel_idTb4b4b4]Tb4b4b4[Te6edf3IDX_TT_IFTb4b4b4] Tff7b72= Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffhandle_tunnelTb4b4b4(Te6edf3tunnel_idTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Te6edf3expires Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffTUNNEL_TIMEOUT
Tff7b72if Tff7b72not Te6edf3tunnel_id Tff7b72in Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTunnel endpoint Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3tunnel_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff established.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3paths Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72with Te6edf3TransportTff7b72.Td2a8fftunnels_lockTb4b4b4:
Te6edf3tunnel_entry Tff7b72= Tb4b4b4[Te6edf3tunnel_idTb4b4b4, Te6edf3interfaceTb4b4b4, Te6edf3pathsTb4b4b4, Te6edf3expiresTb4b4b4]
Te6edf3interfaceTff7b72.Td2a8fftunnel_id Tff7b72= Te6edf3tunnel_id
Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4[Te6edf3tunnel_idTb4b4b4] Tff7b72= Te6edf3tunnel_entry
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTunnel endpoint Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3tunnel_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff reappeared. Restoring paths...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3tunnel_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4[Te6edf3tunnel_idTb4b4b4]
Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_IFTb4b4b4] Tff7b72= Te6edf3interface
Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_EXPIRESTb4b4b4] Tff7b72= Te6edf3expires
Te6edf3interfaceTff7b72.Td2a8fftunnel_id Tff7b72= Te6edf3tunnel_id
Te6edf3paths Tff7b72= Te6edf3tunnel_entryTb4b4b4[Te6edf3IDX_TT_PATHSTb4b4b4]
Te6edf3deprecated_paths Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Te6edf3TransportTff7b72.Td2a8fftunnels_lockTb4b4b4:
Tff7b72for Te6edf3destination_hashTb4b4b4, Te6edf3path_entry Tff7b72in Te6edf3pathsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3received_from Tff7b72= Te6edf3path_entryTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3announce_hops Tff7b72= Te6edf3path_entryTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3expires Tff7b72= Te6edf3path_entryTb4b4b4[T79c0ff3Tb4b4b4]
Te6edf3random_blobs Tff7b72= Tffa657listTb4b4b4(Tffa657setTb4b4b4(Te6edf3path_entryTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3receiving_interface Tff7b72= Te6edf3interface
Te6edf3packet_hash Tff7b72= Te6edf3path_entryTb4b4b4[T79c0ff6Tb4b4b4]
Te6edf3new_entry Tff7b72= Tb4b4b4[Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3received_fromTb4b4b4, Te6edf3announce_hopsTb4b4b4, Te6edf3expiresTb4b4b4, Te6edf3random_blobsTb4b4b4, Te6edf3receiving_interfaceTb4b4b4, Te6edf3packet_hashTb4b4b4]
Te6edf3should_add Tff7b72= Tff7b72False
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3old_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]
Te6edf3old_hops Tff7b72= Te6edf3old_entryTb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4]
Te6edf3old_expires Tff7b72= Te6edf3old_entryTb4b4b4[Te6edf3IDX_PT_EXPIRESTb4b4b4]
Tff7b72if Te6edf3announce_hops Tff7b72<Tff7b72= Te6edf3old_hops Tff7b72or Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3old_expiresTb4b4b4:
Te6edf3current_random_blobs Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_RANDBLOBSTb4b4b4]
Te6edf3current_path_timebase Tff7b72= Te6edf3TransportTff7b72.Td2a8fftimebase_from_random_blobsTb4b4b4(Te6edf3current_random_blobsTb4b4b4)
Te6edf3tunnel_announce_timebase Tff7b72= Te6edf3TransportTff7b72.Td2a8fftimebase_from_random_blobsTb4b4b4(Te6edf3random_blobsTb4b4b4)
Tff7b72if Te6edf3tunnel_announce_timebase Tff7b72>Tff7b72= Te6edf3current_path_timebaseTb4b4b4: Te6edf3should_add Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDid not restore path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff because existing path is more recentTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDid not restore path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff because a newer path with fewer hops existTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3expiresTb4b4b4: Te6edf3should_add Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDid not restore path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff because it has expiredTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3should_addTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3new_entry
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRestored path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is now Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3announce_hopsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hops away via Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3received_fromTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3receiving_interfaceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3deprecated_pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72for Te6edf3deprecated_path Tff7b72in Te6edf3deprecated_pathsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemoving path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3deprecated_pathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff from tunnel Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3tunnel_idTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8fftunnels_lockTb4b4b4: Te6edf3pathsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3deprecated_pathTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffclean_destinations_mapTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_lockTb4b4b4:
Tff7b72for Te6edf3destination Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinationsTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3destinationTff7b72.Td2a8ffhash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4[Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4] Tff7b72= Te6edf3destination
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Te6edf3stale_destination_hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_lockTb4b4b4:
Te6edf3found Tff7b72= Tff7b72False
Tff7b72for Te6edf3destination Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinationsTb4b4b4:
Tff7b72if Te6edf3destinationTff7b72.Td2a8ffhash Tff7b72== Te6edf3destination_hashTb4b4b4: Te6edf3found Tff7b72= Tff7b72True
Tff7b72if Tff7b72not Te6edf3foundTb4b4b4: Te6edf3stale_destination_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3stale_destination_hashesTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffregister_destinationTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4:
Te6edf3destinationTff7b72.Td2a8ffMTU Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTU
Tff7b72if Te6edf3destinationTff7b72.Td2a8ffdirection Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_lockTb4b4b4:
Tff7b72for Te6edf3registered_destination Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinationsTb4b4b4:
Tff7b72if Te6edf3destinationTff7b72.Td2a8ffhash Tff7b72== Te6edf3registered_destinationTff7b72.Td2a8ffhashTb4b4b4:
Tff7b72raise Tf85149KeyErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to register an already registered destination.Ta5d6ff"Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffdestinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destinationTb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4[Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4] Tff7b72= Te6edf3destination
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Te6edf3destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.25Tb4b4b4)
Te6edf3destinationTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3path_responseTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffderegister_destinationTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_lockTb4b4b4:
Tff7b72if Te6edf3destination Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinationsTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffdestinationsTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3destinationTb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Tff7b72if Te6edf3destinationTff7b72.Td2a8ffhash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffregister_linkTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRegistering link Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3linkTff7b72.Td2a8ffinitiatorTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpending_links_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpending_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3linkTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffactive_links_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffactive_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3linkTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffactivate_linkTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffActivating link Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpending_links_lockTb4b4b4:
Tff7b72if Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpending_linksTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4: Tff7b72raise Tf85149IOErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid link state for link activation: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3linkTff7b72.Td2a8ffstatusTb4b4b4)Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffpending_linksTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3linkTb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffactive_links_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffactive_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3linkTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVE
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAttempted to activate a link that was not in the pending tableTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffregister_announce_handlerTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
T8b949e"""
Registers an announce handler.
:param handler: Must be an object with an *aspect_filter* attribute and a *received_announce(destination_hash, announced_identity, app_data)*
or *received_announce(destination_hash, announced_identity, app_data, announce_packet_hash)* or
*received_announce(destination_hash, announced_identity, app_data, announce_packet_hash, is_path_response)* callable. Can
optionally have a *receive_path_responses* attribute set to ``True``, to also receive all path responses, in addition to live
announces. See the :ref:`Announce Example<example-announce>` for more info.
"""
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_handler_lockTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3handlerTb4b4b4, Ta5d6ff"Ta5d6ffreceived_announceTa5d6ff"Tb4b4b4) Tff7b72and Tffa657callableTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffreceived_announceTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3handlerTb4b4b4, Ta5d6ff"Ta5d6ffaspect_filterTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3TransportTff7b72.Td2a8ffannounce_handlersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3handlerTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffderegister_announce_handlerTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
T8b949e"""
Deregisters an announce handler.
:param handler: The announce handler to be deregistered.
"""
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_handler_lockTb4b4b4:
Tff7b72while Te6edf3handler Tff7b72in Te6edf3TransportTff7b72.Td2a8ffannounce_handlersTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffannounce_handlersTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3handlerTb4b4b4)
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffinterface_hashesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Te6edf3interfaceTff7b72.Td2a8ffget_hashTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4}
Tf0883e@staticmethod
Tff7b72def Td2a8fffind_interface_from_hashTb4b4b4(Te6edf3interface_hashTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffget_hashTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3interface_hashTb4b4b4:
Tff7b72return Te6edf3interface
Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffshould_cacheTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
T8b949e# TODO: Rework the caching system. It's currently
T8b949e# not very useful to even cache Resource proofs,
T8b949e# disabling it for now, until redesigned.
T8b949e# if packet.context == RNS.Packet.RESOURCE_PRF:
T8b949e# return True
Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffclean_cacheTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffcache_clean_lockTff7b72.Td2a8fflockedTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCache clean job still running, postponing until next scheduler intervalTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3acquired_lock Tff7b72= Te6edf3TransportTff7b72.Td2a8ffcache_clean_lockTff7b72.Td2a8ffacquireTb4b4b4(Te6edf3blockingTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3acquired_lockTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffclean_announce_cacheTb4b4b4(Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffcache_last_cleaned Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred while launching the cache clean job. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72if Te6edf3acquired_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffcache_clean_lockTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffclean_announce_cacheTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3target_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffcachepathTb4b4b4, Ta5d6ff"Ta5d6ffannouncesTa5d6ff"Tb4b4b4)
Te6edf3cached_announce_hashes Tff7b72= Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3target_pathTb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4: Te6edf3active_path_hashes Tff7b72= Tffa657listTb4b4b4(Tffa657setTb4b4b4(Tb4b4b4[Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_PACKETTb4b4b4] Tff7b72for Te6edf3dst_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8fftunnels_lockTb4b4b4: Te6edf3tunnel_path_hashes Tff7b72= Tffa657listTb4b4b4(Tffa657setTb4b4b4(Tb4b4b4[Te6edf3path_dictTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_PACKETTb4b4b4] Tff7b72for Te6edf3path_dict Tff7b72in Tb4b4b4[Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4[Te6edf3tunnel_idTb4b4b4]Tb4b4b4[Te6edf3IDX_TT_PATHSTb4b4b4] Tff7b72for Te6edf3tunnel_id Tff7b72in Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4] Tff7b72for Te6edf3dst_hash Tff7b72in Te6edf3path_dictTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3removed Tff7b72= T79c0ff0Tb4b4b4; Te6edf3total Tff7b72= T79c0ff0
Tff7b72for Te6edf3packet_hash Tff7b72in Te6edf3cached_announce_hashesTb4b4b4:
Te6edf3remove Tff7b72= Tff7b72False
Te6edf3full_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3target_pathTb4b4b4, Te6edf3packet_hashTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3full_pathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3target_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3packet_hashTb4b4b4)
Tff7b72exceptTb4b4b4: Te6edf3remove Tff7b72= Tff7b72True
Tff7b72if Tb4b4b4(Tff7b72not Te6edf3target_hash Tff7b72in Te6edf3active_path_hashesTb4b4b4) Tff7b72and Tb4b4b4(Tff7b72not Te6edf3target_hash Tff7b72in Te6edf3tunnel_path_hashesTb4b4b4)Tb4b4b4: Te6edf3remove Tff7b72= Tff7b72True
Tff7b72if Te6edf3removeTb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3full_pathTb4b4b4)Tb4b4b4; Te6edf3removed Tff7b72+Tff7b72= T79c0ff1
Te6edf3total Tff7b72+Tff7b72= T79c0ff1
T8b949e# Low priority, yield thread
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)
Tff7b72if Te6edf3removed Tff7b72> T79c0ff0Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRemoved Tffd700{Te6edf3removedTffd700}Ta5d6ff cached announces in Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3stTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
T8b949e# When caching packets to storage, they are written
T8b949e# exactly as they arrived over their interface. This
T8b949e# means that they have not had their hop count
T8b949e# increased yet! Take note of this when reading from
T8b949e# the packet cache.
Tf0883e@staticmethod
Tff7b72def Td2a8ffcacheTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3force_cacheTff7b72=Tff7b72FalseTb4b4b4, Te6edf3packet_typeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3force_cache Tff7b72or Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffshould_cacheTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3packet_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3packetTff7b72.Td2a8ffget_hashTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3interface_reference Tff7b72= Tff7b72None
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interface_reference Tff7b72= Tffa657strTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4)
Tff7b72if Te6edf3packet_type Tff7b72== Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4: Te6edf3cachepath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffcachepathTb4b4b4, Ta5d6ff"Ta5d6ffannouncesTa5d6ff"Tb4b4b4, Te6edf3packet_hashTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3cachepath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffcachepathTb4b4b4, Te6edf3packet_hashTb4b4b4)
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3cachepathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3umsgpackTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4[Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4, Te6edf3interface_referenceTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError writing packet to cache. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffget_cached_packetTb4b4b4(Te6edf3packet_hashTb4b4b4, Te6edf3packet_typeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3packet_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3packet_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3packet_type Tff7b72== Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4: Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffcachepathTb4b4b4, Ta5d6ff"Ta5d6ffannouncesTa5d6ff"Tb4b4b4, Te6edf3packet_hashTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffcachepathTb4b4b4, Te6edf3packet_hashTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3cached_data Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3cached_dataTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Te6edf3interface_reference Tff7b72= Te6edf3cached_dataTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4) Tff7b72== Te6edf3interface_referenceTb4b4b4:
Te6edf3packetTff7b72.Td2a8ffreceiving_interface Tff7b72= Te6edf3interface
Tff7b72return Te6edf3packet
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffException occurred while getting cached packet.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffcache_request_packetTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/T79c0ff8Tb4b4b4:
Te6edf3packet Tff7b72= Te6edf3TransportTff7b72.Td2a8ffget_cached_packetTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4)
Tff7b72if Te6edf3packet Tff7b72!= Tff7b72NoneTb4b4b4:
T8b949e# If the packet was retrieved from the local
T8b949e# cache, replay it to the Transport instance,
T8b949e# so that it can be directed towards it original
T8b949e# destination.
Te6edf3TransportTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4, Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffcache_requestTb4b4b4(Te6edf3packet_hashTb4b4b4, Te6edf3destinationTb4b4b4)Tb4b4b4:
Te6edf3cached_packet Tff7b72= Te6edf3TransportTff7b72.Td2a8ffget_cached_packetTb4b4b4(Te6edf3packet_hashTb4b4b4)
Tff7b72if Te6edf3cached_packetTb4b4b4:
T8b949e# The packet was found in the local cache,
T8b949e# replay it to the Transport instance.
Te6edf3TransportTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3cached_packetTff7b72.Td2a8ffrawTb4b4b4, Te6edf3cached_packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# The packet is not in the local cache,
T8b949e# query the network.
Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3packet_hashTb4b4b4, Te6edf3context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffCACHE_REQUESTTb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
T8b949e"""
:param destination_hash: A destination hash as *bytes*.
:returns: *True* if a path to the destination is known, otherwise *False*.
"""
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffhops_toTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
T8b949e"""
:param destination_hash: A destination hash as *bytes*.
:returns: The number of hops to the specified destination, or ``RNS.Transport.PATHFINDER_M`` if the number of hops is unknown.
"""
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4: Tff7b72return Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4]
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_M
Tf0883e@staticmethod
Tff7b72def Td2a8ffnext_hopTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
T8b949e"""
:param destination_hash: A destination hash as *bytes*.
:returns: The destination hash as *bytes* for the next hop to the specified destination, or *None* if the next hop is unknown.
"""
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4: Tff7b72return Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_NEXT_HOPTb4b4b4]
Tff7b72elif Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4: Tff7b72return Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhash
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffnext_hop_interfaceTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
T8b949e"""
:param destination_hash: A destination hash as *bytes*.
:returns: The interface for the next hop to the specified destination, or *None* if the interface is unknown.
"""
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4: Tff7b72return Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_RVCD_IFTb4b4b4]
Tff7b72elif Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffshared_instance_interface
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffnext_hop_interface_bitrateTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3next_hop_interface Tff7b72= Te6edf3TransportTff7b72.Td2a8ffnext_hop_interfaceTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3next_hop_interface Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72return Te6edf3next_hop_interfaceTff7b72.Td2a8ffbitrate
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffnext_hop_interface_hw_mtuTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3next_hop_interface Tff7b72= Te6edf3TransportTff7b72.Td2a8ffnext_hop_interfaceTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3next_hop_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3next_hop_interfaceTff7b72.Td2a8ffAUTOCONFIGURE_MTU Tff7b72or Te6edf3next_hop_interfaceTff7b72.Td2a8ffFIXED_MTUTb4b4b4: Tff7b72return Te6edf3next_hop_interfaceTff7b72.Td2a8ffHW_MTU
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffnext_hop_per_bit_latencyTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3next_hop_interface_bitrate Tff7b72= Te6edf3TransportTff7b72.Td2a8ffnext_hop_interface_bitrateTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3next_hop_interface_bitrate Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72return Tb4b4b4(T79c0ff1Tff7b72/Te6edf3next_hop_interface_bitrateTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffnext_hop_per_byte_latencyTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3per_bit_latency Tff7b72= Te6edf3TransportTff7b72.Td2a8ffnext_hop_per_bit_latencyTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3per_bit_latency Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72return Te6edf3per_bit_latencyTff7b72*T79c0ff8
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8fffirst_hop_timeoutTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3latency Tff7b72= Te6edf3TransportTff7b72.Td2a8ffnext_hop_per_byte_latencyTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3latency Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTU Tff7b72* Te6edf3latency Tff7b72+ Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffDEFAULT_PER_HOP_TIMEOUT
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffDEFAULT_PER_HOP_TIMEOUT
Tf0883e@staticmethod
Tff7b72def Td2a8ffextra_link_proof_timeoutTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interface Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72return Tb4b4b4(Tb4b4b4(T79c0ff1Tff7b72/Te6edf3interfaceTff7b72.Td2a8ffbitrateTb4b4b4)Tff7b72*T79c0ff8Tb4b4b4)Tff7b72*Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTU
Tff7b72elseTb4b4b4: Tff7b72return T79c0ff0
Tf0883e@staticmethod
Tff7b72def Td2a8ffexpire_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_TIMESTAMPTb4b4b4] Tff7b72= T79c0ff0
Te6edf3TransportTff7b72.Td2a8fftables_last_culled Tff7b72= T79c0ff0
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffmark_path_unresponsiveTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_states_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpath_statesTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3TransportTff7b72.Td2a8ffSTATE_UNRESPONSIVE
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffmark_path_responsiveTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_states_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpath_statesTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3TransportTff7b72.Td2a8ffSTATE_RESPONSIVE
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffmark_path_unknown_stateTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_states_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpath_statesTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3TransportTff7b72.Td2a8ffSTATE_UNKNOWN
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffpath_is_unresponsiveTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_states_lockTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_statesTb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffpath_statesTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72== Te6edf3TransportTff7b72.Td2a8ffSTATE_UNRESPONSIVETb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffawait_pathTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72NoneTb4b4b4, Te6edf3on_interfaceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
Requests a path to the destination from the network and
blocks until the path is available, or the timeout is reached.
:param destination_hash: A destination hash as *bytes*.
:param timeout: An optional timeout in seconds.
:param on_interface: If specified, the path request will only be sent on this interface. In normal use, Reticulum handles this automatically, and this parameter should not be used.
:returns: *True* if a path to the destination is found, otherwise *False*.
"""
Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Tb4b4b4(Te6edf3timeout Tff7b72if Te6edf3timeout Tff7b72else Te6edf3TransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4)
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3on_interfaceTff7b72=Te6edf3on_interfaceTb4b4b4)
Tff7b72while Tff7b72not Te6edf3TransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3timeoutTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.05Tb4b4b4)
Tff7b72return Te6edf3TransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3on_interfaceTff7b72=Tff7b72NoneTb4b4b4, Te6edf3tagTff7b72=Tff7b72NoneTb4b4b4, Te6edf3recursiveTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
T8b949e"""
Requests a path to the destination from the network. If
another reachable peer on the network knows a path, it
will announce it.
:param destination_hash: A destination hash as *bytes*.
:param on_interface: If specified, the path request will only be sent on this interface. In normal use, Reticulum handles this automatically, and this parameter should not be used.
"""
Tff7b72if Te6edf3tag Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3request_tag Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffget_random_hashTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3request_tag Tff7b72= Te6edf3tag
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3path_request_data Tff7b72= Te6edf3destination_hashTff7b72+Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTff7b72+Te6edf3request_tag
Tff7b72elseTb4b4b4: Te6edf3path_request_data Tff7b72= Te6edf3destination_hashTff7b72+Te6edf3request_tag
Te6edf3path_request_dst Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAINTb4b4b4, Te6edf3TransportTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrequestTa5d6ff"Tb4b4b4)
Te6edf3packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3path_request_dstTb4b4b4, Te6edf3path_request_dataTb4b4b4, Te6edf3packet_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffDATATb4b4b4, Te6edf3transport_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffBROADCASTTb4b4b4, Te6edf3header_type Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffHEADER_1Tb4b4b4, Te6edf3attached_interface Tff7b72= Te6edf3on_interfaceTb4b4b4)
Tff7b72if Te6edf3on_interface Tff7b72!= Tff7b72None Tff7b72and Te6edf3recursiveTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3on_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffannounce_capTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3on_interfaceTff7b72.Td2a8ffannounce_cap Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffANNOUNCE_CAP
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3on_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffannounce_allowed_atTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3on_interfaceTff7b72.Td2a8ffannounce_allowed_at Tff7b72= T79c0ff0
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3on_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3on_interfaceTff7b72.Td2a8ffannounce_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3queued_announces Tff7b72= Tff7b72True Tff7b72if Tffa657lenTb4b4b4(Te6edf3on_interfaceTff7b72.Td2a8ffannounce_queueTb4b4b4) Tff7b72> T79c0ff0 Tff7b72else Tff7b72False
Tff7b72if Te6edf3queued_announcesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking recursive path request on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3on_interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff due to queued announcesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72return
Tff7b72elseTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3now Tff7b72< Te6edf3on_interfaceTff7b72.Td2a8ffannounce_allowed_atTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBlocking recursive path request on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3on_interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff due to active announce capTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72return
Tff7b72elseTb4b4b4:
Te6edf3tx_time Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3path_request_dataTb4b4b4)Tff7b72+Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffHEADER_MINSIZETb4b4b4)Tff7b72*T79c0ff8Tb4b4b4) Tff7b72/ Te6edf3on_interfaceTff7b72.Td2a8ffbitrate
Te6edf3wait_time Tff7b72= Tb4b4b4(Te6edf3tx_time Tff7b72/ Te6edf3on_interfaceTff7b72.Td2a8ffannounce_capTb4b4b4)
Te6edf3on_interfaceTff7b72.Td2a8ffannounce_allowed_at Tff7b72= Te6edf3now Tff7b72+ Te6edf3wait_time
Te6edf3packetTff7b72.Td2a8ffis_outbound_pr Tff7b72= Tff7b72True
Te6edf3packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_requests_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpath_requestsTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffremote_status_handlerTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3remote_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3response Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657listTb4b4b4) Tff7b72and Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3response Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3responseTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffget_interface_statsTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3responseTff7b72.Td2a8ffappendTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffget_link_countTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while processing remote status request from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3remote_identityTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffremote_path_handlerTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3remote_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3response Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657listTb4b4b4) Tff7b72and Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3command Tff7b72= Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3destination_hash Tff7b72= Tff7b72None
Te6edf3max_hops Tff7b72= Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> T79c0ff1Tb4b4b4: Te6edf3destination_hash Tff7b72= Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> T79c0ff2Tb4b4b4: Te6edf3max_hops Tff7b72= Te6edf3dataTb4b4b4[T79c0ff2Tb4b4b4]
Tff7b72if Te6edf3command Tff7b72== Ta5d6ff"Ta5d6fftableTa5d6ff"Tb4b4b4:
Te6edf3table Tff7b72= Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffget_path_tableTb4b4b4(Te6edf3max_hopsTff7b72=Te6edf3max_hopsTb4b4b4)
Te6edf3response Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3path Tff7b72in Te6edf3tableTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72== Tff7b72None Tff7b72or Te6edf3destination_hash Tff7b72== Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3responseTff7b72.Td2a8ffappendTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72elif Te6edf3command Tff7b72== Ta5d6ff"Ta5d6ffratesTa5d6ff"Tb4b4b4:
Te6edf3table Tff7b72= Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffget_rate_tableTb4b4b4(Tb4b4b4)
Te6edf3response Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3path Tff7b72in Te6edf3tableTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72== Tff7b72None Tff7b72or Te6edf3destination_hash Tff7b72== Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3responseTff7b72.Td2a8ffappendTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72return Te6edf3response
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while processing remote status request from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3remote_identityTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffpath_request_handlerTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# If there is at least bytes enough for a destination
T8b949e# hash in the packet, we assume those bytes are the
T8b949e# destination being requested.
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72>Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Te6edf3destination_hash Tff7b72= Te6edf3dataTb4b4b4[Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4]
T8b949e# If there is also enough bytes for a transport
T8b949e# instance ID and at least one tag byte, we
T8b949e# assume the next bytes to be the trasport ID
T8b949e# of the requesting transport instance.
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2Tb4b4b4:
Te6edf3requesting_transport_instance Tff7b72= Te6edf3dataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3requesting_transport_instance Tff7b72= Tff7b72None
Te6edf3tag_bytes Tff7b72= Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2Tb4b4b4:
Te6edf3tag_bytes Tff7b72= Te6edf3dataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:Tb4b4b4]
Tff7b72elif Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tb4b4b4:
Te6edf3tag_bytes Tff7b72= Te6edf3dataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Tb4b4b4]
Tff7b72if Te6edf3tag_bytes Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3tag_bytesTb4b4b4) Tff7b72> Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Te6edf3tag_bytes Tff7b72= Te6edf3tag_bytesTb4b4b4[Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4]
Te6edf3unique_tag Tff7b72= Te6edf3destination_hashTff7b72+Te6edf3tag_bytes
Tff7b72if Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4: Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTff7b72.Td2a8ffreceived_path_requestTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tags_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3unique_tag Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tagsTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_tagsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3unique_tagTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffpath_requestTb4b4b4(Te6edf3destination_hashTb4b4b4,
Te6edf3TransportTff7b72.Td2a8fffrom_local_clientTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4,
Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4,
Te6edf3requestor_transport_id Tff7b72= Te6edf3requesting_transport_instanceTb4b4b4,
Te6edf3tagTff7b72=Te6edf3tag_bytesTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIgnoring duplicate path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with tag Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3unique_tagTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIgnoring tagless path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while handling path request. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffpath_requestTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3is_from_local_clientTb4b4b4, Te6edf3attached_interfaceTb4b4b4, Te6edf3requestor_transport_idTff7b72=Tff7b72NoneTb4b4b4, Te6edf3tagTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3should_search_for_unknown Tff7b72= Tff7b72False
Te6edf3should_ingress_limit Tff7b72= Tff7b72False
Te6edf3search_mode_filter Tff7b72= Tff7b72None
Tff7b72if Te6edf3attached_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3should_ingress_limit Tff7b72= Te6edf3attached_interfaceTff7b72.Td2a8ffshould_ingress_limit_prTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3attached_interfaceTff7b72.Td2a8ffrecursive_prsTb4b4b4: Te6edf3should_search_for_unknown Tff7b72= Tff7b72True
Tff7b72elif Te6edf3attached_interfaceTff7b72.Td2a8ffmode Tff7b72in Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffDISCOVER_PATHS_FORTb4b4b4: Te6edf3should_search_for_unknown Tff7b72= Tff7b72True
Tff7b72elif Te6edf3attached_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_BOUNDARYTb4b4b4:
Te6edf3should_search_for_unknown Tff7b72= Tff7b72True
Te6edf3search_mode_filter Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffBOUNDARY_SEARCH_MODES
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4)Tb4b4b4:
Te6edf3interface_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff on Tffd700{Te6edf3attached_interfaceTffd700}Ta5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPath request for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tffd700}Tffd700{Te6edf3interface_strTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4)
Te6edf3destination_exists_on_local_client Tff7b72= Tff7b72False
Tff7b72if Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3destination_interface Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_RVCD_IFTb4b4b4]
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffis_local_client_interfaceTb4b4b4(Te6edf3destination_interfaceTb4b4b4)Tb4b4b4:
Te6edf3destination_exists_on_local_client Tff7b72= Tff7b72True
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpending_local_prs_lockTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpending_local_path_requestsTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3attached_interface
Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_used_destination_dataTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3local_destination Tff7b72= Tff7b72None
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdestinations_map_lockTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4: Te6edf3local_destination Tff7b72= Te6edf3TransportTff7b72.Td2a8ffdestinations_mapTb4b4b4[Te6edf3destination_hashTb4b4b4]
Tff7b72if Te6edf3local_destination Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3local_destinationTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3path_responseTff7b72=Tff7b72TrueTb4b4b4, Te6edf3tagTff7b72=Te6edf3tagTb4b4b4, Te6edf3attached_interfaceTff7b72=Te6edf3attached_interfaceTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAnswering path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Te6edf3interface_strTff7b72+Ta5d6ff"Ta5d6ff, destination is local to this systemTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elif Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72or Te6edf3is_from_local_clientTb4b4b4) Tff7b72and Tb4b4b4(Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4)Tb4b4b4:
Te6edf3packet Tff7b72= Te6edf3TransportTff7b72.Td2a8ffget_cached_packetTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_PACKETTb4b4b4]Tb4b4b4, Te6edf3packet_typeTff7b72=Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4)
Te6edf3next_hop Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_NEXT_HOPTb4b4b4]
Te6edf3received_from Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_RVCD_IFTb4b4b4]
Tff7b72if Te6edf3packet Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not retrieve announce packet from cache while answering path request for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tffd700}Ta5d6ff, ignoring path requestTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elif Te6edf3attached_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMING Tff7b72and Te6edf3attached_interface Tff7b72== Te6edf3received_fromTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNot answering path request on roaming-mode interface, since next hop is on same roaming-mode interfaceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3packetTff7b72.Td2a8ffunpackTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Te6edf3packetTff7b72.Td2a8ffhops Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4]
Tff7b72if Te6edf3requestor_transport_id Tff7b72!= Tff7b72None Tff7b72and Te6edf3next_hop Tff7b72== Te6edf3requestor_transport_idTb4b4b4:
T8b949e# TODO: Find a bandwidth efficient way to invalidate our
T8b949e# known path on this signal. The obvious way of signing
T8b949e# path requests with transport instance keys is quite
T8b949e# inefficient. There is probably a better way. Doing
T8b949e# path invalidation here would decrease the network
T8b949e# convergence time. Maybe just drop it?
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNot answering path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Te6edf3interface_strTff7b72+Ta5d6ff"Ta5d6ff, since next hop is the requestorTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAnswering path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Te6edf3interface_strTff7b72+Ta5d6ff"Ta5d6ff, path is knownTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3retries Tff7b72= Te6edf3TransportTff7b72.Td2a8ffPATHFINDER_R
Te6edf3local_rebroadcasts Tff7b72= T79c0ff0
Te6edf3block_rebroadcasts Tff7b72= Tff7b72True
Te6edf3announce_hops Tff7b72= Te6edf3packetTff7b72.Td2a8ffhops
Tff7b72if Te6edf3is_from_local_clientTb4b4b4:
Te6edf3retransmit_timeout Tff7b72= Te6edf3now
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffis_local_client_interfaceTb4b4b4(Te6edf3TransportTff7b72.Td2a8ffnext_hop_interfaceTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPath request destination Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is on a local client interface, rebroadcasting immediatelyTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3retransmit_timeout Tff7b72= Te6edf3now
Tff7b72elseTb4b4b4:
Te6edf3retransmit_timeout Tff7b72= Te6edf3now Tff7b72+ Te6edf3TransportTff7b72.Td2a8ffPATH_REQUEST_GRACE
T8b949e# If we are answering on a roaming-mode interface, wait a
T8b949e# little longer, to allow potential more well-connected
T8b949e# peers to answer first.
Tff7b72if Te6edf3attached_interfaceTff7b72.Td2a8ffmode Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMINGTb4b4b4:
Te6edf3retransmit_timeout Tff7b72+Tff7b72= Te6edf3TransportTff7b72.Td2a8ffPATH_REQUEST_RG
T8b949e# This handles an edge case where a peer sends a past
T8b949e# request for a destination just after an announce for
T8b949e# said destination has arrived, but before it has been
T8b949e# rebroadcast locally. In such a case the actual announce
T8b949e# is temporarily held, and then reinserted when the path
T8b949e# request has been served to the peer.
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4:
Te6edf3held_entry Tff7b72= Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4]
Te6edf3TransportTff7b72.Td2a8ffheld_announcesTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Te6edf3held_entry
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffannounce_table_lockTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffannounce_tableTb4b4b4[Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Tb4b4b4[Te6edf3nowTb4b4b4, Te6edf3retransmit_timeoutTb4b4b4, Te6edf3retriesTb4b4b4, Te6edf3received_fromTb4b4b4, Te6edf3announce_hopsTb4b4b4, Te6edf3packetTb4b4b4, Te6edf3local_rebroadcastsTb4b4b4, Te6edf3block_rebroadcastsTb4b4b4, Te6edf3attached_interfaceTb4b4b4]
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ff_used_destination_dataTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72elif Te6edf3is_from_local_clientTb4b4b4:
T8b949e# Forward path request on all interfaces
T8b949e# except the local client
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffForwarding path request from local client for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Te6edf3interface_strTff7b72+Ta5d6ff"Ta5d6ff to all other interfacesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3request_tag Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffget_random_hashTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Tff7b72not Te6edf3interface Tff7b72== Te6edf3attached_interfaceTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3interfaceTb4b4b4, Te6edf3tag Tff7b72= Te6edf3request_tagTb4b4b4)
Tff7b72elif Te6edf3should_search_for_unknownTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdiscovery_path_requestsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThere is already a waiting path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on behalf of path requestTa5d6ff"Tff7b72+Te6edf3interface_strTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
T8b949e# Abort recursive path request if receiving
T8b949e# interface has PR burst active, or should
T8b949e# otherwise ingress limit path requests.
Tff7b72if Te6edf3should_ingress_limitTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4)Tb4b4b4:
Te6edf3interface_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff for Tffd700{Te6edf3attached_interfaceTffd700}Ta5d6ff" Tff7b72if Te6edf3attached_interface Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNot sending recursive path requestTffd700{Te6edf3interface_strTffd700}Ta5d6ff due to active ingress limitingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4)
Tff7b72return
T8b949e# Forward path request on all interfaces
T8b949e# except the requestor interface
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAttempting to discover unknown path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on behalf of path requestTa5d6ff"Tff7b72+Te6edf3interface_strTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3pr_entry Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destination_hashTb4b4b4, Ta5d6ff"Ta5d6fftimeoutTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3TransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4, Ta5d6ff"Ta5d6ffrequesting_interfaceTa5d6ff"Tb4b4b4: Te6edf3attached_interface Tb4b4b4}
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffdiscovery_pr_lockTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffdiscovery_path_requestsTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3pr_entry
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Te6edf3search_mode_filter Tff7b72and Tff7b72not Te6edf3interfaceTff7b72.Td2a8ffmode Tff7b72in Te6edf3search_mode_filterTb4b4b4: Tff7b72continue
Tff7b72if Tff7b72not Te6edf3interface Tff7b72== Te6edf3attached_interfaceTb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffshould_egress_limit_prTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNot sending recursive path request on Tffd700{Te6edf3interfaceTffd700}Ta5d6ff due to active egress limitingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
T8b949e# Use the previously extracted tag from this path request
T8b949e# on the new path requests as well, to avoid potential loops
Te6edf3TransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3on_interfaceTff7b72=Te6edf3interfaceTb4b4b4, Te6edf3tagTff7b72=Te6edf3tagTb4b4b4, Te6edf3recursiveTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72elif Tff7b72not Te6edf3is_from_local_client Tff7b72and Tffa657lenTb4b4b4(Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
T8b949e# Forward the path request on all local
T8b949e# client interfaces
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffForwarding path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Te6edf3interface_strTff7b72+Ta5d6ff"Ta5d6ff to local clientsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3on_interfaceTff7b72=Te6edf3interfaceTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIgnoring path request for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Te6edf3interface_strTff7b72+Ta5d6ff"Ta5d6ff, no path knownTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8fffrom_local_clientTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3TransportTff7b72.Td2a8ffis_local_client_interfaceTb4b4b4(Te6edf3packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffis_local_client_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffparent_interfaceTb4b4b4, Ta5d6ff"Ta5d6ffis_local_shared_instanceTa5d6ff"Tb4b4b4)Tb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffis_shared_instanceTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffis_local_shared_instanceTa5d6ff"Tb4b4b4)Tb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffinterface_to_shared_instanceTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffis_connected_to_shared_instanceTa5d6ff"Tb4b4b4)Tb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffdetach_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3closed_links Tff7b72= T79c0ff0
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffactive_linksTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3closed_links Tff7b72+Tff7b72= T79c0ff1
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not tear down active link before interface detach: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpending_linksTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3closed_links Tff7b72+Tff7b72= T79c0ff1
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not tear down pending link before interface detach: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
T8b949e# Provide a 150ms window to allow link teardown
T8b949e# packets to leave local transport
Tff7b72if Te6edf3closed_linksTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.15Tb4b4b4)
Te6edf3detachable_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
T8b949e# Currently no rules are being applied
T8b949e# here, and all interfaces will be sent
T8b949e# the detach call on RNS teardown.
Tff7b72if Tff7b72not Te6edf3interfaceTff7b72.Td2a8ffdetachedTb4b4b4: Te6edf3detachable_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72pass
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4:
T8b949e# Currently no rules are being applied
T8b949e# here, and all interfaces will be sent
T8b949e# the detach call on RNS teardown.
Tff7b72if Tff7b72not Te6edf3interfaceTff7b72.Td2a8ffdetachedTb4b4b4: Te6edf3detachable_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72pass
Te6edf3shared_instance_master Tff7b72= Tff7b72None
Te6edf3local_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3detach_threads Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDetaching interfacesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72for Te6edf3interface Tff7b72in Te6edf3detachable_interfacesTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3interfaceTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffLocalInterfaceTff7b72.Td2a8ffLocalServerInterfaceTb4b4b4:
Te6edf3shared_instance_master Tff7b72= Te6edf3interface
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3interfaceTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffLocalInterfaceTff7b72.Td2a8ffLocalClientInterfaceTb4b4b4:
Te6edf3local_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72def Td2a8ffdetach_jobTb4b4b4(Te6edf3interfaceTff7b72=Te6edf3interfaceTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDetaching Tffd700{Te6edf3interfaceTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Te6edf3interfaceTff7b72.Td2a8ffdetachTb4b4b4(Tb4b4b4)
Te6edf3dt Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3detach_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3dtTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3detach_threadsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dtTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while detaching Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72for Te6edf3dt Tff7b72in Te6edf3detach_threadsTb4b4b4:
Te6edf3dtTff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDetaching local clientsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72for Te6edf3li Tff7b72in Te6edf3local_interfacesTb4b4b4:
Te6edf3liTff7b72.Td2a8ffdetachTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDetaching shared instanceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3shared_instance_master Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3shared_instance_masterTff7b72.Td2a8ffdetachTb4b4b4(Tb4b4b4)
Te6edf3BackboneInterfaceTff7b72.Td2a8ffderegister_listenersTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAll interfaces detachedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffshared_connection_disappearedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffactive_links_lockTb4b4b4:
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffactive_linksTb4b4b4: Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpending_links_lockTb4b4b4:
Tff7b72for Te6edf3link Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpending_linksTb4b4b4: Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffannounce_table Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3TransportTff7b72.Td2a8ffpath_table Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3TransportTff7b72.Td2a8ffreverse_table Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3TransportTff7b72.Td2a8fflink_table Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3TransportTff7b72.Td2a8ffheld_announces Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3TransportTff7b72.Td2a8fftunnels Tff7b72= Tb4b4b4{Tb4b4b4}
Tf0883e@staticmethod
Tff7b72def Td2a8ffshared_connection_reappearedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72for Te6edf3registered_destination Tff7b72in Te6edf3TransportTff7b72.Td2a8ffdestinationsTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3registered_destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Te6edf3registered_destinationTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3path_responseTff7b72=Tff7b72TrueTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffdrop_announce_queuesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3interface Tff7b72in Te6edf3TransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffannounce_queue Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3na Tff7b72= Tffa657lenTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffannounce_queueTb4b4b4)
Tff7b72if Te6edf3na Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3na Tff7b72== T79c0ff1Tb4b4b4: Te6edf3na_str Tff7b72= Ta5d6ff"Ta5d6ff1 announceTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3na_str Tff7b72= Tffa657strTb4b4b4(Te6edf3naTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff announcesTa5d6ff"
Te6edf3interfaceTff7b72.Td2a8ffannounce_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDropped Ta5d6ff"Tff7b72+Te6edf3na_strTff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8fftimebase_from_random_blobTb4b4b4(Te6edf3random_blobTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657intTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3random_blobTb4b4b4[T79c0ff5Tb4b4b4:T79c0ff10Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffbigTa5d6ff"Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8fftimebase_from_random_blobsTb4b4b4(Te6edf3random_blobsTb4b4b4)Tb4b4b4:
Te6edf3timebase Tff7b72= T79c0ff0
Tff7b72for Te6edf3random_blob Tff7b72in Te6edf3random_blobsTb4b4b4:
Te6edf3emitted Tff7b72= Te6edf3TransportTff7b72.Td2a8fftimebase_from_random_blobTb4b4b4(Te6edf3random_blobTb4b4b4)
Tff7b72if Te6edf3emitted Tff7b72> Te6edf3timebaseTb4b4b4: Te6edf3timebase Tff7b72= Te6edf3emitted
Tff7b72return Te6edf3timebase
Tf0883e@staticmethod
Tff7b72def Td2a8ffannounce_emittedTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
Te6edf3random_blob Tff7b72= Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffNAME_HASH_LENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8Tff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffNAME_HASH_LENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72+T79c0ff10Tb4b4b4]
Te6edf3announce_emitted Tff7b72= Te6edf3TransportTff7b72.Td2a8fftimebase_from_random_blobTb4b4b4(Te6edf3random_blobTb4b4b4)
Tff7b72return Te6edf3announce_emitted
Tf0883e@staticmethod
Tff7b72def Td2a8ffsave_packet_hashlistTb4b4b4(Te6edf3backgroundTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3TransportTb4b4b4, Ta5d6ff"Ta5d6ffsaving_packet_hashlistTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3wait_interval Tff7b72= T79c0ff0.2
Te6edf3wait_timeout Tff7b72= T79c0ff5
Te6edf3wait_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72while Te6edf3TransportTff7b72.Td2a8ffsaving_packet_hashlistTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3wait_intervalTb4b4b4)
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3wait_startTff7b72+Te6edf3wait_timeoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not save packet hashlist to storage, waiting for previous save operation timed out.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffsaving_packet_hashlist Tff7b72= Tff7b72True
Te6edf3save_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaving packet hashlist to storage...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4: Tff7b72return
Te6edf3round_started_at Tff7b72= Te6edf3save_start
Te6edf3yield_threshold Tff7b72= T79c0ff0.010
Te6edf3packet_hashlist_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/packet_hashlist.rawTa5d6ff"
Tff7b72with Tffa657openTb4b4b4(Te6edf3packet_hashlist_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fileTb4b4b4:
Tff7b72for Te6edf3packet_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpacket_hashlistTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3backgroundTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3round_started_at Tff7b72> Te6edf3yield_thresholdTb4b4b4:
T8b949e# Low priority, yield thread
Te6edf3round_started_at Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3packet_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSaved packet hashlist in Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3save_startTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not save packet hashlist to storage, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72finallyTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffsaving_packet_hashlist Tff7b72= Tff7b72False
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffsave_path_tableTb4b4b4(Te6edf3backgroundTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3TransportTb4b4b4, Ta5d6ff"Ta5d6ffsaving_path_tableTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3wait_interval Tff7b72= T79c0ff0.2
Te6edf3wait_timeout Tff7b72= T79c0ff5
Te6edf3wait_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72while Te6edf3TransportTff7b72.Td2a8ffsaving_path_tableTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3wait_intervalTb4b4b4)
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3wait_startTff7b72+Te6edf3wait_timeoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not save path table to storage, waiting for previous save operation timed out.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffsaving_path_table Tff7b72= Tff7b72True
Te6edf3save_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaving path table to storage...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3serialised_destinations Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3path_table Tff7b72= Te6edf3TransportTff7b72.Td2a8ffpath_tableTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3interface_hashes_updated_at Tff7b72= T79c0ff0
Te6edf3round_started_at Tff7b72= Te6edf3save_start
Te6edf3yield_threshold Tff7b72= T79c0ff0.010
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3path_tableTb4b4b4:
Tff7b72if Te6edf3backgroundTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3round_started_at Tff7b72> Te6edf3yield_thresholdTb4b4b4:
T8b949e# Low priority, yield thread
Te6edf3round_started_at Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)
Tff7b72tryTb4b4b4:
T8b949e# Throttle interface hash lookup to 2 seconds
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3interface_hashes_updated_at Tff7b72+ T79c0ff2Tb4b4b4:
Te6edf3interface_hashes Tff7b72= Te6edf3TransportTff7b72.Td2a8ffinterface_hashesTb4b4b4(Tb4b4b4)
T8b949e# Get the destination entry from the destination table
Te6edf3de Tff7b72= Te6edf3path_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]
Te6edf3interface Tff7b72= Te6edf3deTb4b4b4[Te6edf3IDX_PT_RVCD_IFTb4b4b4]
T8b949e# Only store destination table entry if the associated
T8b949e# interface is still active
Tff7b72if Tff7b72not Te6edf3interfaceTff7b72.Td2a8ffget_hashTb4b4b4(Tb4b4b4) Tff7b72in Te6edf3interface_hashesTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSkipping persist for path table entry Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tffd700}Ta5d6ff, interface Tffd700{Te6edf3interfaceTffd700}Ta5d6ff no longer activeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
T8b949e# Get the destination entry from the destination table
Tff7b72if Tff7b72not Te6edf3destination_hash Tff7b72in Te6edf3path_tableTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSkipping persist for path table entry Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tffd700}Ta5d6ff, no longer in tableTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3de Tff7b72= Te6edf3path_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]
Te6edf3timestamp Tff7b72= Te6edf3deTb4b4b4[Te6edf3IDX_PT_TIMESTAMPTb4b4b4]
Te6edf3received_from Tff7b72= Te6edf3deTb4b4b4[Te6edf3IDX_PT_NEXT_HOPTb4b4b4]
Te6edf3hops Tff7b72= Te6edf3deTb4b4b4[Te6edf3IDX_PT_HOPSTb4b4b4]
Te6edf3expires Tff7b72= Te6edf3deTb4b4b4[Te6edf3IDX_PT_EXPIRESTb4b4b4]
Te6edf3random_blobs Tff7b72= Te6edf3deTb4b4b4[Te6edf3IDX_PT_RANDBLOBSTb4b4b4]
Te6edf3packet_hash Tff7b72= Te6edf3deTb4b4b4[Te6edf3IDX_PT_PACKETTb4b4b4]
Te6edf3interface_hash Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffget_hashTb4b4b4(Tb4b4b4)
Te6edf3serialised_entry Tff7b72= Tb4b4b4[ Te6edf3destination_hashTb4b4b4,
Te6edf3timestampTb4b4b4,
Te6edf3received_fromTb4b4b4,
Te6edf3hopsTb4b4b4,
Te6edf3expiresTb4b4b4,
Te6edf3random_blobsTb4b4b4,
Te6edf3interface_hashTb4b4b4,
Te6edf3packet_hash Tb4b4b4]
Te6edf3serialised_destinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3serialised_entryTb4b4b4)
T8b949e# TODO: Reevaluate whether there is any cases where this is needed
T8b949e# Transport.cache(de[IDX_PT_PACKET], force_cache=True)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSkipping persist for path table entry due to error: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3path_table_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/destination_tableTa5d6ff"
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3path_table_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3umsgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3serialised_destinationsTb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3save_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3save_start
Tff7b72if Te6edf3save_time Tff7b72< T79c0ff1Tb4b4b4: Te6edf3time_str Tff7b72= Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3save_timeTff7b72*T79c0ff1000Tb4b4b4,T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffmsTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3time_str Tff7b72= Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3save_timeTb4b4b4,T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3serialised_destinationsTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff path table entries in Ta5d6ff"Tff7b72+Te6edf3time_strTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not save path table to storage, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffsaving_path_table Tff7b72= Tff7b72False
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffsave_tunnel_tableTb4b4b4(Te6edf3backgroundTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3TransportTb4b4b4, Ta5d6ff"Ta5d6ffsaving_tunnel_tableTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3wait_interval Tff7b72= T79c0ff0.2
Te6edf3wait_timeout Tff7b72= T79c0ff5
Te6edf3wait_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72while Te6edf3TransportTff7b72.Td2a8ffsaving_tunnel_tableTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3wait_intervalTb4b4b4)
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3wait_startTff7b72+Te6edf3wait_timeoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not save tunnel table to storage, waiting for previous save operation timed out.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffsaving_tunnel_table Tff7b72= Tff7b72True
Te6edf3save_start Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaving tunnel table to storage...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3serialised_tunnels Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3round_started_at Tff7b72= Te6edf3save_start
Te6edf3yield_threshold Tff7b72= T79c0ff0.010
Tff7b72for Te6edf3tunnel_id Tff7b72in Te6edf3TransportTff7b72.Td2a8fftunnelsTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3backgroundTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3round_started_at Tff7b72> Te6edf3yield_thresholdTb4b4b4:
T8b949e# Low priority, yield thread
Te6edf3round_started_at Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)
Te6edf3te Tff7b72= Te6edf3TransportTff7b72.Td2a8fftunnelsTb4b4b4[Te6edf3tunnel_idTb4b4b4]
Te6edf3interface Tff7b72= Te6edf3teTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3tunnel_paths Tff7b72= Te6edf3teTb4b4b4[T79c0ff2Tb4b4b4]Tff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3expires Tff7b72= Te6edf3teTb4b4b4[T79c0ff3Tb4b4b4]
Tff7b72if Te6edf3interface Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interface_hash Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffget_hashTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3interface_hash Tff7b72= Tff7b72None
Te6edf3serialised_paths Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3tunnel_pathsTb4b4b4:
Te6edf3de Tff7b72= Te6edf3tunnel_pathsTb4b4b4[Te6edf3destination_hashTb4b4b4]
Te6edf3timestamp Tff7b72= Te6edf3deTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3received_from Tff7b72= Te6edf3deTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3hops Tff7b72= Te6edf3deTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3expires Tff7b72= Te6edf3deTb4b4b4[T79c0ff3Tb4b4b4]
Te6edf3random_blobs Tff7b72= Te6edf3deTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4[Tff7b72-Te6edf3TransportTff7b72.Td2a8ffPERSIST_RANDOM_BLOBSTb4b4b4:Tb4b4b4]
Te6edf3packet_hash Tff7b72= Te6edf3deTb4b4b4[T79c0ff6Tb4b4b4]
Te6edf3serialised_entry Tff7b72= Tb4b4b4[
Te6edf3destination_hashTb4b4b4,
Te6edf3timestampTb4b4b4,
Te6edf3received_fromTb4b4b4,
Te6edf3hopsTb4b4b4,
Te6edf3expiresTb4b4b4,
Te6edf3random_blobsTb4b4b4,
Te6edf3interface_hashTb4b4b4,
Te6edf3packet_hash
Tb4b4b4]
Te6edf3serialised_pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3serialised_entryTb4b4b4)
T8b949e# TODO: Reevaluate whether there are any cases where this is needed
T8b949e# Transport.cache(de[6], force_cache=True)
Te6edf3serialised_tunnel Tff7b72= Tb4b4b4[Te6edf3tunnel_idTb4b4b4, Te6edf3interface_hashTb4b4b4, Te6edf3serialised_pathsTb4b4b4, Te6edf3expiresTb4b4b4]
Te6edf3serialised_tunnelsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3serialised_tunnelTb4b4b4)
Te6edf3tunnels_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/tunnelsTa5d6ff"
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3tunnels_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3umsgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3serialised_tunnelsTb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3save_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3save_start
Tff7b72if Te6edf3save_time Tff7b72< T79c0ff1Tb4b4b4: Te6edf3time_str Tff7b72= Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3save_timeTff7b72*T79c0ff1000Tb4b4b4,T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffmsTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3time_str Tff7b72= Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3save_timeTb4b4b4,T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3serialised_tunnelsTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff tunnel table entries in Ta5d6ff"Tff7b72+Te6edf3time_strTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not save tunnel table to storage, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffsaving_tunnel_table Tff7b72= Tff7b72False
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffpersist_dataTb4b4b4(Te6edf3backgroundTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffpersist_lockTff7b72.Td2a8fflockedTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpersist_lockTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffsave_packet_hashlistTb4b4b4(Te6edf3backgroundTff7b72=Te6edf3backgroundTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffsave_path_tableTb4b4b4(Te6edf3backgroundTff7b72=Te6edf3backgroundTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffsave_tunnel_tableTb4b4b4(Te6edf3backgroundTff7b72=Te6edf3backgroundTb4b4b4)
Te6edf3gcTff7b72.Td2a8ffcollectTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffvoid_queuesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffheld_announces Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3TransportTff7b72.Td2a8ffreceipts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3TransportTff7b72.Td2a8ffreverse_table Tff7b72= Tb4b4b4{Tb4b4b4}
Tf0883e@staticmethod
Tff7b72def Td2a8ffexit_handlerTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3TransportTff7b72.Td2a8ff_should_run Tff7b72= Tff7b72False
Te6edf3TransportTff7b72.Td2a8ffvoid_queuesTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3TransportTff7b72.Td2a8ffownerTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffpersist_dataTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffblackhole_identityTb4b4b4(Te6edf3identity_hashTb4b4b4, Te6edf3untilTff7b72=Tff7b72NoneTb4b4b4, Te6edf3reasonTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
Blackholes an identity.
:param identity_hash: The identity hash to blackhole as *bytes*.
:param until: Optional unix timestamp of when the blackhole expires as *float* or *int*.
:param reason: Optional reason for the blackhole as *str*.
:returns: *True* if successful, otherwise *False*.
"""
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Te6edf3identity_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4:
Te6edf3entry Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Ta5d6ff"Ta5d6ffuntilTa5d6ff"Tb4b4b4: Te6edf3untilTb4b4b4, Ta5d6ff"Ta5d6ffreasonTa5d6ff"Tb4b4b4: Te6edf3reasonTb4b4b4}
Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4[Te6edf3identity_hashTb4b4b4] Tff7b72= Te6edf3entry
Te6edf3TransportTff7b72.Td2a8ffpersist_blackholeTb4b4b4(Tb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffremove_blackholed_pathsTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBlackholed identity Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while blackholing identity: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffunblackhole_identityTb4b4b4(Te6edf3identity_hashTb4b4b4)Tb4b4b4:
T8b949e"""
Lifts blackhole for an identity.
:param identity_hash: The identity hash to blackhole as *bytes*.
:returns: *True* if successful, otherwise *False*.
"""
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3identity_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4:
Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3identity_hashTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffpersist_blackholeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLifted blackhole for identity Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while unblackholing identity: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffreload_blackholeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3source_count Tff7b72= T79c0ff0
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72for Te6edf3filename Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackholepathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3filename Tff7b72== Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4: Te6edf3source_identity_hash Tff7b72= Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhash
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3filenameTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIdentity hash length for blackhole source Tffd700{Te6edf3filenameTffd700}Ta5d6ff is invalidTa5d6ff"Tb4b4b4)
Te6edf3source_identity_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3filenameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3source_identity_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackhole_sourcesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSkipping disabled blackhole source Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3source_identity_hashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Tff7b72continue
Te6edf3sourcepath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackholepathTb4b4b4, Te6edf3filenameTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3sourcepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3packed Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3source_list Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3packedTb4b4b4)
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3source_listTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Tff7b72if Te6edf3identity_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4[Te6edf3identity_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4:
Tff7b72continue
Te6edf3se Tff7b72= Te6edf3source_listTb4b4b4[Te6edf3identity_hashTb4b4b4]
Te6edf3until Tff7b72= Te6edf3seTb4b4b4[Ta5d6ff"Ta5d6ffuntilTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffuntilTa5d6ff" Tff7b72in Te6edf3se Tff7b72else Tff7b72None
Te6edf3reason Tff7b72= Te6edf3seTb4b4b4[Ta5d6ff"Ta5d6ffreasonTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffreasonTa5d6ff" Tff7b72in Te6edf3se Tff7b72else Tff7b72None
Te6edf3entry Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Te6edf3source_identity_hashTb4b4b4, Ta5d6ff"Ta5d6ffuntilTa5d6ff"Tb4b4b4: Te6edf3untilTb4b4b4, Ta5d6ff"Ta5d6ffreasonTa5d6ff"Tb4b4b4: Te6edf3reasonTb4b4b4}
Tff7b72if Te6edf3until Tff7b72== Tff7b72None Tff7b72or Te6edf3now Tff7b72< Te6edf3untilTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4[Te6edf3identity_hashTb4b4b4] Tff7b72= Te6edf3entry
Te6edf3source_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not load blackholed identities from source file Tffd700{Te6edf3filenameTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Te6edf3TransportTff7b72.Td2a8ffremove_blackholed_pathsTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffremove_blackholed_pathsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3drop_destinations Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3associated_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3_no_useTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3associated_identity Tff7b72and Te6edf3associated_identityTff7b72.Td2a8ffhash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4:
Tff7b72if Tff7b72not Te6edf3destination_hash Tff7b72in Te6edf3drop_destinationsTb4b4b4: Te6edf3drop_destinationsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while enumerating blackhole-associated destinations: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3drop_destinationsTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3TransportTff7b72.Td2a8ffpath_table_lockTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffpath_tableTb4b4b4: Te6edf3TransportTff7b72.Td2a8ffpath_tableTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while dropping blackhole-associated destination from path table: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3drop_destinationsTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Tffa657lenTb4b4b4(Te6edf3drop_destinationsTb4b4b4) Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRemoved Tffd700{Tffa657lenTb4b4b4(Te6edf3drop_destinationsTb4b4b4)Tffd700}Ta5d6ff destinationTffd700{Te6edf3msTffd700}Ta5d6ff associated with blackholed identities from path tableTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffblackhole_list_handlerTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72return Te6edf3TransportTff7b72.Td2a8ffblackholed_identities
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while processing blackhole list request from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3remote_identityTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffpersist_blackholeTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3local_blackhole Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4:
Tff7b72if Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4[Te6edf3identity_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3TransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4:
Te6edf3local_blackholeTb4b4b4[Te6edf3identity_hashTb4b4b4] Tff7b72= Te6edf3TransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4[Te6edf3identity_hashTb4b4b4]
Te6edf3packed Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3local_blackholeTb4b4b4)
Te6edf3localpath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackholepathTb4b4b4, Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4)
Te6edf3tmppath Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3localpathTffd700}Ta5d6ff.tmpTa5d6ff"
Tff7b72with Tffa657openTb4b4b4(Te6edf3tmppathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4: Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3packedTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3localpathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3localpathTb4b4b4)
Te6edf3osTff7b72.Td2a8ffrenameTb4b4b4(Te6edf3tmppathTb4b4b4, Te6edf3localpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while persisting blackhole list: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
T8b949e# Table entry indices
T8b949e# Transport.path_table entry indices
Te6edf3IDX_PT_TIMESTAMP Tff7b72= T79c0ff0
Te6edf3IDX_PT_NEXT_HOP Tff7b72= T79c0ff1
Te6edf3IDX_PT_HOPS Tff7b72= T79c0ff2
Te6edf3IDX_PT_EXPIRES Tff7b72= T79c0ff3
Te6edf3IDX_PT_RANDBLOBS Tff7b72= T79c0ff4
Te6edf3IDX_PT_RVCD_IF Tff7b72= T79c0ff5
Te6edf3IDX_PT_PACKET Tff7b72= T79c0ff6
T8b949e# Transport.reverse_table entry indices
Te6edf3IDX_RT_RCVD_IF Tff7b72= T79c0ff0
Te6edf3IDX_RT_OUTB_IF Tff7b72= T79c0ff1
Te6edf3IDX_RT_TIMESTAMP Tff7b72= T79c0ff2
T8b949e# Transport.announce_table entry indices
Te6edf3IDX_AT_TIMESTAMP Tff7b72= T79c0ff0
Te6edf3IDX_AT_RTRNS_TMO Tff7b72= T79c0ff1
Te6edf3IDX_AT_RETRIES Tff7b72= T79c0ff2
Te6edf3IDX_AT_RCVD_IF Tff7b72= T79c0ff3
Te6edf3IDX_AT_HOPS Tff7b72= T79c0ff4
Te6edf3IDX_AT_PACKET Tff7b72= T79c0ff5
Te6edf3IDX_AT_LCL_RBRD Tff7b72= T79c0ff6
Te6edf3IDX_AT_BLCK_RBRD Tff7b72= T79c0ff7
Te6edf3IDX_AT_ATTCHD_IF Tff7b72= T79c0ff8
T8b949e# Transport.link_table entry indices
Te6edf3IDX_LT_TIMESTAMP Tff7b72= T79c0ff0
Te6edf3IDX_LT_NH_TRID Tff7b72= T79c0ff1
Te6edf3IDX_LT_NH_IF Tff7b72= T79c0ff2
Te6edf3IDX_LT_REM_HOPS Tff7b72= T79c0ff3
Te6edf3IDX_LT_RCVD_IF Tff7b72= T79c0ff4
Te6edf3IDX_LT_HOPS Tff7b72= T79c0ff5
Te6edf3IDX_LT_DSTHASH Tff7b72= T79c0ff6
Te6edf3IDX_LT_VALIDATED Tff7b72= T79c0ff7
Te6edf3IDX_LT_PROOF_TMO Tff7b72= T79c0ff8
T8b949e# Transport.tunnels entry indices
Te6edf3IDX_TT_TUNNEL_ID Tff7b72= T79c0ff0
Te6edf3IDX_TT_IF Tff7b72= T79c0ff1
Te6edf3IDX_TT_PATHS Tff7b72= T79c0ff2
Te6edf3IDX_TT_EXPIRES Tff7b72= T79c0ff3
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────